중첩된 여러 하위 디렉터리에서 특정 확장자를 가진 파일을 단일 디렉터리로 복사하고 복사된 각 파일에 디렉터리 이름을 추가합니다.

중첩된 여러 하위 디렉터리에서 특정 확장자를 가진 파일을 단일 디렉터리로 복사하고 복사된 각 파일에 디렉터리 이름을 추가합니다.

하위 디렉터리 등에 수천 개의 디렉터리가 있는 상위 디렉터리가 있습니다. 하위 디렉터리 에는 some여러 이미지 파일이 있습니다.

하위 디렉터리에 있는 rsync모든 파일을 bmp하위 디렉터리 없이 새 디렉터리로 복사하고 싶습니다. jpg그러나 동시에 복사된 파일에 파일이 있던 마지막 디렉터리의 이름을 추가하고 싶습니다.

├── example1
│   ├── fdfd
│   │   ├── db_files
│   │   │   ├── asdasd.zip
│   │   │   ├── dfdfsta.zip
│   │   │   ├── csf_4545.zip
│   │   │   ├── 45455.zip
│   │   │   ├── 4544.zip
│   │   │   ├── 45545.zip
│   │   │   ├── gfdfgd.zip
│   │   │   ├── retert.zip
│   │   │   ├── vcxvxc.zip
│   │   │   ├── vcxcvcx.zip
│   │   │   ├── asdr3.zip
│   │   │   ├── tetst.zip
│   │   │   ├── testeh.bmp
│   │   │   └── testst43.zip
│   │   ├── TEST_FILE.bmp
│   │   └── hfexport.csv
│   └── testFOLDER2018-05
│       ├── Databasef.txt
│       ├── Folder_Backup_2014-01-05.7z
│       ├── full_Export.pdf
│       ├── f-to-7000.csv
│       ├── f-to-505.csv
│       ├── f-to-600.csv
│       ├── f-to-960.bmp
│       ├── g-to-1000.jpg
│       └── 7000.csv
├── example3
│   ├── img_copy
│   │   ├── automation
│   │   │   ├── f.sh
│   │   │   ├── fff.sh
│   │   │   └── test.bat
│   │   ├── all.bmp
│   │   ├── h23.txt
│   │   ├── old2_copy.jpg

위의 예에서 복사된 파일은 다음과 같습니다.

db_files_testeh.bmp
fdfd_TEST_FILE.bmp
testFOLDER2018-05_f-to-960.bmp
testFOLDER2018-05_g-to-1000.jpg
img_copy_all.bmp
img_copy_old2_copy.jpg

이 목표를 어떻게 달성할 수 있나요?

다음 명령을 사용하여 파일만 새 디렉터리 bmp에 복사합니다.jpg

find -regex '.*\.\(bmp\|jpg\)' | tee /home/tmp/matches.txt
while read -r LINE; do rsync -vh --append-verify --chmod=ugo=rwX --progress --stats "$LINE" /mnt/storage3/backups/NEW_DIR/ONLY_IMAGES; done < /home/tmp/matches.txt

답변1

find . -type f '(' -name '*.bmp' -o -name '*.jpg' ')' -exec sh -c '
    for pathname do
        newname="${pathname%/*}_${pathname##*/}"  # a/b/c/d.bmp --> a/b/c_d.bmp
        newname="target/${newname##*/}"           # a/b/c_d.bmp --> target/c_d.bmp

        printf "Would move %s to %s\n" "$pathname" "$newname"
        # mv -i "$pathname" "$newname"
    done' sh {} +

.jpg파일 이름이 또는로 끝나는 모든 일반 파일을 찾습니다 .bmp. 이러한 파일 배치의 경우 짧은 쉘 스크립트가 실행됩니다.

쉘 스크립트는 각 파일의 디렉토리 경로 이름과 해당 파일 이름을 추출하여 두 파일을 밑줄로 연결합니다. 이것이 새로운 이름을 형성했습니다. 그러면 새 이름의 초기 디렉터리가 제거되고 파일 이름만 남고 이 이름에 대상 디렉터리 경로가 추가됩니다.

결승전은 안전상의 이유로 mv주석 처리되었습니다 . 한 번 실행하고 주석을 달아 제대로 작동하는지 확인하세요.

관련된:

관련 정보