複数のネストされたサブディレクトリから、特定の拡張子を持つファイルを単一のディレクトリにコピーし、コピーされた各ファイルにディレクトリ名を追加します。

複数のネストされたサブディレクトリから、特定の拡張子を持つファイルを単一のディレクトリにコピーし、コピーされた各ファイルにディレクトリ名を追加します。

サブディレクトリなどに数千のディレクトリがある親ディレクトリがあります。サブディレクトリには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コメントされています。一度実行し、コメントを付けて正しく機能することを確認してください。

関連:

おすすめ記事