쉘 스크립트: 여러 폴더의 첫 번째 파일을 하나의 폴더로 복사

쉘 스크립트: 여러 폴더의 첫 번째 파일을 하나의 폴더로 복사

디렉터리 내에는 수백 개의 하위 디렉터리가 있습니다. 각 하위 디렉터리에는 수백 개의 jpg 이미지가 있습니다. 폴더 이름이 "ABC_DEF"인 경우 해당 폴더 내의 파일 이름은 "ABC_DEF-001.jpg", "ABC_DEF-002.jpg" 등이 됩니다.

예를 들어:

---Main Directory
------Sub-Directory ABC_DEF
----------ABC_DEF-001.jpg
----------ABC_DEF-002.jpg
------Sub-Directory ABC_GHI
----------ABC_GHI-001.jpg
----------ABC_GHI-002.jpg

각 하위 디렉터리의 첫 번째 파일(예: 확장자가 -001.jpg인 파일)만 DESTDIR이라는 공용 대상 폴더에 복사하고 싶습니다.

주어진 코드를 변경했습니다여기내 사용 사례에 맞게. 그러나 항상 파일 이름과 함께 첫 번째 디렉터리를 인쇄하므로 파일을 원하는 대상에 복사할 수 없습니다. 코드는 다음과 같습니다.

DIR=/var/www/html/beeinfo.org/resources/videos/
find "$DIR" -type d |
while read d;
do
    files=$(ls -t "$d" | sed -n '1h; $ { s/\n/,/g; p }')
    printf '%s,%s\n' "$files";
done

이 코드를 어떻게 수정할 수 있나요?

답변1

find모든 파일이 동일한 깊이의 디렉터리에 있는 이유는 무엇 입니까?

cd -- "$DIR" &&
  cp -- */*-001.jpg /destination/path

답변2

find패턴 으로 끝나는 첫 번째 파일을 선택해야 하고 각 하위 디렉터리에 파일이 하나만 있는 경우에만 -001.jpg이 작업을 쉽게 수행할 수 있으므로 명령은 다음과 같습니다.

find . -name "*-001.jpg" -execdir echo cp -v {} /path/to/dest/ \;

노트: echo예상한 결과가 나온 후 테스트 실행을 위해 제거하세요.

답변3

find -exec {} +다음을 사용하여 파일 목록을 얻을 수 있습니다 cp.

find /path/to/main/dir -name "*-001.jpg" -exec cp -t /path/to/dest/dir/ {} +

먼저 기능을 테스트하려면 cp로 바꾸십시오 echo cp.

답변4

각 하위 디렉터리의 번호 순서대로 첫 번째 일반 파일에 대해 zsh다음을 수행할 수 있습니다.

cp -- *(/e['reply=($REPLY/*(Nn.[1]))']) /path/to/destination/

가장 나이 많은 사람의 경우:

cp -- *(/e['reply=($REPLY/*(NOm.[1]))']) /path/to/destination/

관련 정보