태그 보관물: recursive

recursive

여러 개의 하위 디렉토리에서 특정 확장자를 가진 모든 파일을 하나의 디렉토리로 이동 파일이 많이 있습니다. Fol1/Fol2 Fol3 Fol4/Fol5 모든 파일을 공통 기본 폴더로

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

Fol1/Fol2
Fol3
Fol4/Fol5

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



답변

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 {} \;


답변

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

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


답변

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

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

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


답변

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

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 파일이 표시됩니다.


답변

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콘텐츠 대신 명명 규칙에 의존하더라도 ).


답변

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

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

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


답변