다음 파일이 포함된 디렉터리가 있습니다.
aaaXXXbbb.png
aaaYYYccc.png
xxxAAAyyy.png
yyyAAAxxx.png
이제 쉘 스크립트를 사용하여 접두어 'aaa' 및 접미어 '.png'가 있는 모든 파일을 새 디렉토리에 복사하고 싶습니다. 2개의 파일 'aaaXXXbbb.png' 및 'aaaYYYccc.png'를 가정해 보겠습니다.
답변1
cp aaa*.png /some/destdir
이는 문자열로 시작 하고 문자열로 끝나는 aaa
모든 파일 이름 과 일치하며 .png
모두 디렉토리에 복사됩니다 /some/destdir
. *
이름 중간에 있는 모든 문자와 일치 합니다 .
이 패턴과 일치하는 파일이 수천 개 있으면 결과 목록이 너무 길어서 이 작업이 실패합니다.
이 경우 다음 루프와 같은 것을 사용하십시오.
for name in aaa*.png; do
cp "$name" /some/destdir
done
그러면 파일이 하나씩 복사됩니다.
수천 개의 파일에 대해 보다 효율적인 접근 방식은 다음과 같습니다(GNU cp
및 해당 -t
옵션 사용).
find . -maxdepth 1 -type f -name 'aaa*.png' -exec cp -t /some/destdir {} +
또는 (GNU 없이 cp
):
find . -maxdepth 1 -type f -name 'aaa*.png' -exec sh -c 'cp "$@" /some/destdir' sh {} +
마지막 명령은 현재 디렉토리에서 이름이 패턴과 일치하는 모든 일반 파일을 찾고 find
, 이러한 파일 배치에 대해 짧은 인라인 쉘 스크립트를 호출합니다. 짧은 인라인 셸 스크립트는 현재 배치(합당하고 관리 가능한 파일 수)의 파일을 대상 디렉터리에 복사합니다.-type f
-maxdepth 1
aaa*.png
find
사용 에 대한 추가 정보 -exec
:"find"의 -exec 옵션 이해
답변2
라이너를 사용하면 다음과 같이 할 수 있습니다.
grep '^aaa.*\.png$' list.txt | xargs -I '{}' cp '{}' destination_dir/
grep
줄 시작 부분에서 "aaa"를 찾고 그 뒤에 0개 이상의 문자가 오고 ".png"로 끝납니다. 그런 다음 이를 매개변수 목록으로 "destination_dir"에 cp
파이프합니다 .
파일 디렉터리에 있는 경우 cp
다음 명령을 사용할 수 있습니다.
cp aaa*.png destination_dir
답변3
그리고 find
:
find . -maxdepth 1 -type f -name aaa\*.png -exec cp {} destination \;
.
현재 디렉터리를 나타냅니다.
-maxdepth 1
현재 디렉토리만 보라고 지시
type -f
파일을 찾도록 지시
-name aaa\*.png
aaa
다음으로 시작하고 끝나는 파일을 나타냅니다 ..png
-exec cp {} destination \;
파일을 이름이 지정된 디렉터리에 복사합니다 destination
.
내 환경에서는 를 *
사용해야 합니다 \
. 귀하의 환경에서는 이것이 필요하지 않을 수도 있으므로 사용할 수 있습니다.aaa*.png