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


8

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

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

답변:


14

명령은 다음과 같습니다.

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

판사는 또한 수락 할 것이다 :find /path/to/dir/ -name '*.c' | xargs cp -t /target/
Oli

나는 심사 위원 중 하나이고 나는 코멘트) 8이 솔루션 감사를 거부, 나는 :)을 추가합니다
hytromo

1
xargs일반적으로 훨씬 빠릅니다. 방금 c 파일의로드를 찾아서 실행하는 빠른 테스트를 실행 ls -l했습니다. 그것은 0m2.420s xargs와 0m25.494s입니다 -exec... 분명히이 경우 cp작업은 대부분의 시간이 걸리므로 중요하지 않지만 주목할 가치가 있습니다.
Oli

-n`` switch to the 중복 이름의 경우 덮어 쓰기를 피하기 위해 cp` 명령을 추가하는 것이 좋습니다 (또는 필요에 따라 대상을 복사하고 이름을 바꾸기 전에 중복을 확인하는 스크립트 작성)
Geek

2

나는 당신의 목적에 완벽하게 맞는 것이라고 생각하는 또 다른 방법이 있습니다. 당신은 결합 할 수 있습니다 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 사용에 대한 훌륭한 소개는 이 기사 도 참조하십시오 .


find ~/Downloads -type f -iname '*.mp3' | while read mp3file; do cp "$mp3file" ~/Music; done더 간단 하지 않습니까?
steabert

내 방법은 모범 사례를 나타내며 인용 한 링크에 명시된 것처럼 스크립트가 중단되는 것을 방지합니다.

아, 알
다시피

-n`` switch to the 중복 이름의 경우 덮어 쓰기를 피하기 위해 cp` 명령을 추가하는 것이 좋습니다 (또는 필요에 따라 대상을 복사하고 이름을 바꾸기 전에 중복을 확인하는 스크립트 작성)
Geek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.