サブディレクトリなどに数千のディレクトリがある親ディレクトリがあります。サブディレクトリには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
。このようなファイル配置の場合、ショートシェルスクリプトが実行されます。
シェルスクリプトは、各ファイルのディレクトリパス名とそのファイル名を抽出し、2つのファイルを下線で連結します。これが新しい名前を形成しました。これにより、新しい名前の初期ディレクトリが削除され、ファイル名のみが残り、この名前にターゲットディレクトリパスが追加されます。
決勝戦は安全上の理由でmv
コメントされています。一度実行し、コメントを付けて正しく機能することを確認してください。
関連: