디렉터리 내에는 수백 개의 하위 디렉터리가 있습니다. 각 하위 디렉터리에는 수백 개의 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/