패턴으로 검색하여 같은 폴더에 다른 이름으로 복사하세요.

패턴으로 검색하여 같은 폴더에 다른 이름으로 복사하세요.

폴더 구조는 다음과 같습니다.

/홈/사용자/사진/휴가/이탈리아/로마/사진.앞쪽.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이므로 내용을 덮어씁니다).

관련 정보