여러 개의 하위 디렉토리에서 특정 확장자를 가진 모든 파일을 하나의 디렉토리로 이동


42

여러 디렉토리에 .zip 파일이 많이 있습니다.

Fol1/Fol2
Fol3
Fol4/Fol5

모든 파일을 공통 기본 폴더로 어떻게 이동합니까?


디렉토리 구조를 유지 하시겠습니까? 디렉토리 또는 zip 파일 만 이동 하시겠습니까?
jordanm

그냥 zip 파일을 옮기고 싶습니다. 나는 실제로 디렉토리에 신경 쓰지 않는다-그것들은 남겨 두거나 삭제할 수있다.
InquilineKea

답변:


54

zip 파일 ( cd …)을 포함하는 트리의 최상위 디렉토리로 이동 한 후 다음을 실행하십시오.

mv **/*.zip /path/to/single/target/directory

이것은 zsh에서 즉시 작동합니다. 쉘이 bash라면 shopt -s globstar먼저 실행해야합니다 (이 명령을에 넣을 수 있어야합니다 ~/.bashrc). 쉘이 ksh라면 set -o globstar먼저 실행해야합니다 (에 넣으십시오 ~/.kshrc).

또는 find특별한 준비없이 모든 곳에서 작동하지만 더 복잡한 use를 사용하십시오 .

find . -name '*.zip' -exec mv {} /path/to/single/target/directory \;

나중에 zsh에서 빈 디렉토리를 제거하려면 다음을 수행하십시오.

rmdir **/*(/^Fod)

bash 또는 ksh에서 :

rmdir **/*/

제거 할 빈 디렉토리가있는 한 반복하십시오. 또는 모든 쉘에서

find . -depth -type d -empty -exec rmdir {} \;

find위의 첫 번째 명령은 bash에서 작동했지만 find . -name작동 하도록 etc로 변경 해야했습니다.
JeffThompson

1
@Jeff .는 GNU 찾기에는 암시 적이지만 다른 사람들에게는 그렇지 않습니다.
Gilles 'SO- 악한 중지'

13

.zip파일 만 이동하려는 경우 다음과 같은 작업을 수행 할 수 있습니다.

mkdir ./zipfiles
find . -name "*.zip" -exec mv "{}" ./zipfiles \;

3

당신이 사용하는 경우 bash는 버전 4 이상 또는 zsh을 당신은 또한 재귀 대체 (globbing)을 사용할 수 있습니다 :

mv **/*.zip /path/to/move/zip/files/to

상대 경로가 아닌 파일 만 이동하므로 충돌이 발생할 수 있습니다.


상대 경로는 무엇을 의미합니까?
Kunok

2

이것은 데이터를 이동하고 오류가 없을 때 안전하며 버전에 관계없이 모든 배포판을 대부분 지원했습니다. 이 명령은 하위 디렉토리를 스캔 한 다음 새 대상 디렉토리로 이동하거나 복사합니다.

find . -name *.flac -exec mv '{}' "./flac/" ";"
  • 이동할 파일이있는 서브 디렉토리가있는 기본 디렉토리에서이 명령을 실행하십시오.
  • 귀하의 경우 *.flac와 같이 바꿀 수있는 곳 *.zip. 또는 *.doc모든 확장 기능이 작동합니다.
  • 그리고 mv파일을 이동하는 명령, 또는 당신이 사용할 수있는 cp대신에 이동하는 데이터를 복사 할 수 있습니다.
  • ./flac/모든 FLAC 파일을 이동하려는 대상 디렉토리입니다. 당신은 또한 전체 경로를 줄 수 있습니다/home/myid/flac/

전체 예. (이 경우 음악 아티스트 이름을 가진 여러 하위 디렉토리가 /home/myid/Music/있고 FLAC 파일은 다른 하위 디렉토리 수준에 있습니다. 아티스트 폴더는 필요하지 않지만 모든 FLAC 파일을 하나의 디렉토리에 두려고합니다./home/myid/Music/flac/

cd /home/myid/Music
mkdir flac
find . -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls

그런 다음 모든 FLAC 파일이 표시됩니다.


무엇을 ;합니까?
프란체스코 보이

@FrancescoBoi 같은 줄에서 bash 명령이 작업을 완료 할 때까지 기다려야합니다. bash 명령의 다음 줄로 넘어갑니다. 이것은 .pl 또는 python과 같은 스크립트를 포함하는 명령에 유용합니다. bash는 그냥 실행하고 다음 줄로 건너 뛰기 때문에 안전합니다. bash가 건너 뛰는 경우 시간이나 스크립트가 필요한 명령 뒤에.
Seandex

0

bash hack으로 다음과 같은 기능을 사용할 수 있습니다 tar.

(cd origin/;find . -exec file --mime-type "{}" \;|grep "application/zip"|cut -d ':' -f 1|xargs tar cf -)|(cd target/; tar xf -) && rm -fr origin/

file명령을 사용하여 이동할 파일을 선택하고 디렉토리 구조를 유지하지만 공백이 포함 된 경로에서는 작동하지 않기 때문에 파일 확장자에 의존하지 않는 이점이 있습니다.

마지막 rm은 원본 파일을 제거하는 것입니다 (@InquilineKea는 주석의 원본 폴더에 신경 쓰지 않는다고 말했기 때문에).

물론 이것은 origin / 및 target / 폴더가 다른 디스크에있는 경우에 특히 적합합니다. 그렇지 않으면 제안 된 다른 솔루션이 더 효율적입니다 ( file콘텐츠 대신 명명 규칙에 의존하더라도 ).


0

find 및 mv의 GNU 버전이 있다고 가정하면 다음은 기존의 찾기 기반 답변보다 효율적입니다.

find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +

+find -exec의 끝에서 a 를 사용하면 파일 목록이 발견 된 파일 당 하나의 mv 명령을 실행하지 않고 mv 명령으로 전달됩니다. 그러나 이것의 한계는 명령의 끝에 '{}'만 놓을 수 있다는 것입니다. mv --target-directory 옵션을 사용해야하며, 이것이 GNU-ism이라는 것을 알고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.