パスのディレクトリ名に基づいてファイルを追加(名前変更)および移動

パスのディレクトリ名に基づいてファイルを追加(名前変更)および移動

目的:そのファイルのみを追加(名前変更)して移動パスに次のものが含まれていますすべてのレベルの特定のディレクトリ名。

ディレクトリ名に基づいてツリーからファイルを抽出します。長年にわたって定期的に移動したバックアップから、そのディレクトリのファイルを抽出(移動)してみてください。どの親ディレクトリマッチメディアディレクトリリストの名前をカスタマイズします。フルパスを各ファイルのプレフィックスとして追加し、追加されたファイルを単一のOUTPUTディレクトリに配置します。 (ファイル拡張子をセレクタとして使用することは私の目的には適していません。親ディレクトリ名の1つでなければなりません。)たとえば、

入力ディレクトリ(各ディレクトリには多くのサブディレクトリがあります):

20011231-bkp-1
20021231-bkp-2
20031231-bkp-3

出力(単一の「OUTPUT」ディレクトリの追加ファイル):

20011231-bkp-1__dir-a__dir-b__dir-c__WhatsApp Images__imag-1.jpg
20021231-bkp-2__dir-a__dir-b__dir-c__WhatsApp Images__Sent__imag-1.jpg
20031231-bkp-3__dir-a__Camera__imag-1.mp4
20031231-bkp-3__dir-a__Camera__dir-x__imag-1.mp4

メディアディレクトリのリスト(これらのディレクトリはパスのどこにでも配置できます。スペースに注意してください)すべてのファイルの名前を変更して移動します。正確に一致するもの、再帰的に:

WhatsApp Images
WhatsApp Audio
Recorders
Camera

これは取り付けと移動には有効ですが、難易度が制限されます。ただ「メディアディレクトリリスト」の対応するファイルに:

find 1 -type f| perl -ne 'chop;$from=$_;$to=$_;$to=~s/\//__/g;system("echo mv $from $to")'

ベストアンサー1

私は以下を使用しますfind -path "..." -exec bash -c '...'

find *-bkp-* \
  \( \
    -path "*/WhatsApp Images/*" \
    -or -path "*/WhatsApp Audio/*" \
    -or -path "*/Recorders/*" \
    -or -path "*/Camera/*" \
  \) \
  -exec bash -c '
    OUTPUT_DIR="OUTPUT"
    mkdir -p "$OUTPUT_DIR"
    for f in "$@"; do mv -v "$f" "$OUTPUT_DIR/${f//\//_}"; done
  ' find-sh {} +

-n既存のファイルを上書きせずに既存のファイルを-f強制的に上書きまたはバックアップするなど、既存のファイルに発生する必要がある操作を制御するフラグを追加できます-b

おすすめ記事