쉘을 사용하여 모든 하위 디렉토리에서 파일을 검색 한 다음 해당 파일을 복사하려면 어떻게해야합니까? 재귀 명령으로

ls -R *.mp3여러 하위 디렉토리가 포함 된 디렉토리에서 와 같이 재귀 명령으로 * .mp3 파일 만 찾은 다음 마지막에이 파일을 선택한 디렉토리에 복사 할 수 있습니다.

당신의 지원에 감사드립니다.



답변

명령은 다음과 같습니다.

find /path/to/directory -name "*.mp3" -exec cp {} /some/other/dir/ \;

대안 :

find /path/to/dir/ -name '*.mp3' | xargs cp -t /target/

예:

alex@MaD-pc:~/test$ ls
1  2  3
alex@MaD-pc:~/test$ ls 1 2 3
1:
1.txt  2.mp3  3.txt

2:
4.txt  5.mp3  6.txt

3:
alex@MaD-pc:~/test$ find . -name "*.mp3" -exec cp {} 3/ \;
alex@MaD-pc:~/test$ ls 3
2.mp3  5.mp3

자세한 내용은:

man find

답변

나는 당신의 목적에 완벽하게 맞는 것이라고 생각하는 또 다른 방법이 있습니다. 당신은 결합 할 수 있습니다 findwhile루프, 심지어 중 하나를 사용할 필요가 없습니다 exec또는 xargs전혀. 예를 들어 mp3s다운로드 폴더에서 음악 폴더로 파일을 복사하려면 여러 번 사용한 다음 스크립트를 사용합니다.

find결과 파일 을 검색하고 배치하는 디렉토리를 변경하여 원하는 방식으로 수정할 수 있습니다 . 디렉토리가 지정되어 있지 않으면 find전체 홈 폴더를 검색합니다. 당신은 또한 변경할 수 있습니다 cpmv또는 다른 명령. 방금 3945 .jpg파일로 테스트 했으므로 매우 빠릅니다 ! 텍스트 편집기에 복사하여 저장 한 다음를 실행하여 실행 가능하게 만드십시오 chmod +x myscript.

#!/bin/bash
# a script to recursively find and copy files to a desired location
find ~/Downloads -type f -iname '*.mp3' -print0 |
while IFS= read -r -d '' f;
do cp -- "$f" ~/Music ;
done

이 Bash 위키 에서 while루프와 read명령을 결합하여 명령의 출력을 처리하는 것이 얼마나 유용한 지 보여줍니다 find. 그리고 내가 한 방식으로 파일 이름에 공백이나 다른 예기치 않은 또는 특수 문자가있는 경우 스크립트가 중단되지 않습니다.

find명령 에 대한 일반적인 정보 는 터미널에 입력 man find하거나 Ubuntu 온라인 설명서를 참조하십시오 . find 사용에 대한 훌륭한 소개는 이 기사 도 참조하십시오 .