하위 디렉터리 등에 수천 개의 디렉터리가 있는 상위 디렉터리가 있습니다. 하위 디렉터리 에는 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
주석 처리되었습니다 . 한 번 실행하고 주석을 달아 제대로 작동하는지 확인하세요.
관련된: