폴더 구조는 다음과 같습니다.
/홈/사용자/사진/휴가/이탈리아/로마/사진.앞쪽.001.jpg
로마 폴더에는 다른 사진도 많이 있지만 관심 있는 것은 "앞쪽"파일 이름에. 이 파일을 복사해서 이름을 지정해야 합니다."팬아트.jpg"(아직 로마 폴더에 있음).
이탈리아어 상위 폴더에 저장된 모든 폴더에 대해 이 작업을 수행하고 싶습니다.
이 이미지를 검색 하려고 노력했지만 find
다른 이름을 사용하여 복제할 수 없습니다.
이 문제를 해결하는 방법을 알고 있나요?
답변1
-execdir
이를 사용하여 파일이 있는 디렉토리를 기준으로 복사본을 만들 수 있습니다 .
find Italy -name '*.front.*' -execdir cp -- {} 'fanart.jpg' \;
예: 주어진
$ tree Italy/
Italy/
├── Florence
│ ├── photo.back.001.jpg
│ ├── photo.back.002.jpg
│ ├── photo.back.003.jpg
│ ├── photo.front.001.jpg
│ ├── photo.front.002.jpg
│ └── photo.front.003.jpg
├── Naples
│ ├── photo.back.001.jpg
│ ├── photo.back.002.jpg
│ ├── photo.back.003.jpg
│ ├── photo.front.001.jpg
│ ├── photo.front.002.jpg
│ └── photo.front.003.jpg
└── Rome
├── photo.back.001.jpg
├── photo.back.002.jpg
├── photo.back.003.jpg
├── photo.front.001.jpg
├── photo.front.002.jpg
└── photo.front.003.jpg
3 directories, 18 files
그 다음에
$ find Italy -name '*.front.*' -execdir cp -v -- {} 'fanart.jpg' \;
‘./photo.front.001.jpg’ -> ‘fanart.jpg’
‘./photo.front.003.jpg’ -> ‘fanart.jpg’
‘./photo.front.002.jpg’ -> ‘fanart.jpg’
‘./photo.front.001.jpg’ -> ‘fanart.jpg’
‘./photo.front.003.jpg’ -> ‘fanart.jpg’
‘./photo.front.002.jpg’ -> ‘fanart.jpg’
‘./photo.front.001.jpg’ -> ‘fanart.jpg’
‘./photo.front.003.jpg’ -> ‘fanart.jpg’
‘./photo.front.002.jpg’ -> ‘fanart.jpg’
(이 패턴과 일치하는 파일이 두 개 이상인 경우 *.front.*
복사본이 연속적으로 덮어쓰여집니다. 원하는 내용이 아닌 경우 -n
또는 를 추가하세요 --no-clobber
.)
$ tree Italy/
Italy/
├── Florence
│ ├── fanart.jpg
│ ├── photo.back.001.jpg
│ ├── photo.back.002.jpg
│ ├── photo.back.003.jpg
│ ├── photo.front.001.jpg
│ ├── photo.front.002.jpg
│ └── photo.front.003.jpg
├── Naples
│ ├── fanart.jpg
│ ├── photo.back.001.jpg
│ ├── photo.back.002.jpg
│ ├── photo.back.003.jpg
│ ├── photo.front.001.jpg
│ ├── photo.front.002.jpg
│ └── photo.front.003.jpg
└── Rome
├── fanart.jpg
├── photo.back.001.jpg
├── photo.back.002.jpg
├── photo.back.003.jpg
├── photo.front.001.jpg
├── photo.front.002.jpg
└── photo.front.003.jpg
시스템 버전이 대안을 find
지원하지 않는 경우 -execdir
전체 경로 이름의 파일 이름 부분을 제거하고(예: 양식의 POSIX 매개변수 확장 사용 "${var%/*}"
) 이를 작은 인라인 쉘 명령에서 새 이름으로 바꿀 수 있습니다.sh -c
find Italy -name '*.front.*' -exec sh -c 'cp -v -- "$1" "${1%/*}/fanart.jpg"' sh {} \;
답변2
사용 요구 사항이 있나요 find
? 비슷한 일에는 루프가 더 적합하다고 생각합니다.
$ cd /home/user/Pictures/Vacation/Italy
$ for directory in *; do \
cd "$directory" && \
for file in *front*; do \
cp --force "$file" fanart.jpg; \
done; \
cd /home/user/Pictures/Vacation/Italy; \
done
본질적으로 이것은 "Italy"의 하위 디렉터리를 반복하고 각 하위 디렉터리에 대해 이름에 "Front"가 있는 파일을 "fanart.jpg"라는 파일에 복사합니다(대상 파일 이름이 Changeless이므로 내용을 덮어씁니다).