특정 유형의 모든 파일을 Unix의 디렉토리로 어떻게 이동 (또는 복사) 할 수 있습니까?


22

나는 grep/find/awk/xargs아직 모든 트릭에 익숙하지 않습니다 .

특정 패턴과 일치하는 파일이 *.xxx있습니다. 이러한 파일은 특정 디렉토리에서 임의의 위치에 있습니다. 이러한 파일을 모두 찾아서 Unix의 내 홈 디렉토리에있는 폴더로 옮기려면 어떻게해야합니까?


4
"파일 형식"에 대해 이야기 할 때주의를 기울여야합니다. unixy 환경에서 ".xxx"예제는 Windows 의미의 확장조차 아닙니다. ".xxx"는 파일 이름의 접미사 만 구성합니다. "파일 형식"은 일반 파일, 장치 파일, 심볼릭 링크, 디렉토리, 명명 된 파이프, Unix 제품군 소켓 등 몇 가지 범주 중 하나입니다.
Bruce Ediger


@BruceEdiger 감사합니다. 정말 "filename pattern"을 의미한다고 생각합니다
qodeninja

답변:


22
mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

1
나는 사용합니다mv -i -t ~/dst {} +
enzotib

17

당신은 (넣어 ≥4 bash는, 하나의 대상 디렉토리에 디렉토리 계층 내부의 모든 파일을 이동하려면 shopt -s globstar당신에 ~/.bashrc또는 zsh을) :

mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory

다른 껍질에서 :

mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;

find명령 을 읽는 방법 :

  • .: 현재 디렉토리를 순회
  • -name '*.xxx': 이름이이 패턴과 일치하는 파일에 적용
  • -exec … \;: 파일 {}의 경로로 대체 하여 각 파일에서이 명령을 수행 하십시오.

find파일이 많으면 mv각 파일에 대해 별도의 프로세스 를 호출 할 필요가 없으므로 더 복잡한 명령을 사용 하는 것이 더 빠릅니다 .

find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +

+끝에 알려줍니다 find한 번에 여러 파일에서 명령을 호출 할 수 있습니다. find명령 행의 끝에 파일 이름 만 넣을 수 mv있고 대상 디렉토리를 마지막에 두어야 하므로 중간 쉘을 사용하여 인수를 재 배열합니다 ( "$0"쉘의 첫 번째 인수 ~/new-directory인이며 "$@"이후의 인수입니다). find의 확장 {}).


4

일치하는 소스 파일의 디렉토리 구조를 새 대상 디렉토리에 복제하려는 경우 GNU cp의 --parents 옵션 을 사용할 수 있습니다 .

mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +

3

당신은없이 찾기를 사용할 수 있습니다 -exec‍뿐만 아니라 :

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest

1
그러나 find -exec훨씬 안전합니다. 예를 들어 공백이 포함 된 파일 이름에서는 위의 내용이 실패합니다.
dhag
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.