15000のZipファイルを含むディレクトリがあります。解凍すると、次の形式のファイルを含むすべてのファイルの名前を変更したい
YYYYMMDD_IPC.csv
YYYYMMDD
はたまたま日付ですが、この問題の目的のために正確に8桁の文字列です。次に、Zipファイル自体の名前を変更する必要があります
YYYYMMDD_IPC.Zip.
次のコマンドラインまで取得しましたが、Zipファイルの名前を変更するために使用するファイルからYYYYMMDD
をキャプチャする方法がわかりません。
find . -iname '*.Zip' | while read file; do unzip -l "$file" | grep -q -P '\d{8}_IPC.csv' && echo $file; done 2>&-
読んでくれてありがとう。
_find . -iname '*.Zip' -exec bash -c 'name=$(unzip -qql "$1" '*_IPC.csv' | grep -oE '[[:digit:]]{8}_IPC.csv' | head -n1); [ "$name" ] && mv "$1" "${name%csv}Zip"' none {} ';'
_
このコマンドの形式は次のとおりです。
_find . -iname '*.Zip' -exec bash -c '...' none {} ';'
_
これは、現在のディレクトリとその下のすべてのサブディレクトリで.Zipファイルを検索します。そのようなファイルが見つかるごとに、単一引用符で囲まれたbashコマンドが実行されます。見つかったファイルの名前は、bashコマンドの引数1、_$1
_で提供されます。この場合、bashコマンドには2つの部分があります。最初は、csvファイル名を抽出し、bash変数name
に保存します。
_name=$(unzip -qql "$1" '*_IPC.csv' | grep -oE '[[:digit:]]{8}_IPC.csv' | head -n1)
_
上記ではcommand substitutionを使用しています。$(...)
内のコマンドが実行され、その標準出力がキャプチャされます。この場合、変数name
に割り当てます。コマンド_unzip -qql "$1" '*_IPC.csv'
_は、glob _*_IPC.csv
_に一致するすべてのファイル名をZipファイルから静かに抽出します。グロブ_*_IPC.csv
_に制限する必要はありませんが、Zipファイルに多くのファイルが含まれている場合、これにより速度が向上する可能性があります。
Grepコマンド_rep -oE '[[:digit:]]{8}_IPC.csv'
_はさらに、8桁で始まる名前のみを選択します。 _head -n1
_コマンドは、最初に見つかったそのような名前を選択します。そのような名前が1つしかない場合、_head -n1
_は必要ありません。ただし、head
を保持すると、最初の一致後にパイプラインが終了するため、速度が向上する可能性があります。
2番目の部分では、空でないname
の取得に成功したことをテストし、もしそうであれば、Zipファイルの名前を変更します。
_[ "$name" ] && mv "$1" "${name%csv}Zip"
_
上記ではsuffix Removalを使用してcsvファイル名をZipファイル名に変更します。 _${name%csv}
_は、サフィックスcsv
を削除した後、_$name
_を返します。 _${name%csv}Zip
_はZipサフィックスを追加します。