2016-11-17 14 views
0

多くのファイルで、親ディレクトリを取得してそのファイル名にファイル名を追加したいと考えています。たとえば、次のパスに:親ディレクトリ名に基づいてZIPファイルの名前を変更する

A/B/C/file.zip 

私はfile_C.zipfile.zipの名前を変更したいです。

ここに私のコードです。サブディレクトリとzipファイルが含まれていないディレクトリを見つけなければなりません。親ディレクトリを参照するように名前を変更します。

find ${WORKDIR} -daystart -mtime +3 -type d -links 2 -exec bash -c 'zip -rm "${1%}".zip "$1"' _ {} \; 

答えて

0

このジョブに最適なツールは、Perlに付属のrenameユーティリティです。 (util-linuxには、renameという名前のユーティリティも含まれていますので、それはあなたが望むものではありません。システム上にある場合は、それを取り除き、Perlに付属のものと置き換える方法を調べてください)

このユーティリティは、それはあなたがそれがさらに強力な、それはこの例から、見た目よりなり、第一引数に任意のPerlコードを固執することができます

find $WORKDIR -name '*.zip' -exec \ 
    rename 's:/([^/]+)/(.+?)\.zip$:/${2}_${1}.zip:' '{}' + 

と同じくらい簡単です。

findコマンドは、の.zipファイルを作成することに関連しています。ここで

1

は純粋Bashのソリューションです:

find "$WORKDIR" -type f -name '*.zip' | while read file 
do 
    basename=$(basename "$file") 
    dirname=$(dirname "$file") 
    suffix=$(basename "$dirname") 
    if [[ "$basename" != *"_${suffix}.zip" ]]; then 
    mv -v "$file" "${dirname}/${basename%.zip}_${suffix}.zip" 
    fi 
done 

スクリプトは、ループと$WORKDIRで見つかったすべての*.zipファイルを処理します。ループでは、$fileに親ディレクトリ名と同じサフィックスがすでにあるかどうかを確認します。このような接尾辞が付いていない場合、スクリプトは"_{parent_directory_name}"のファイル名を拡張子の直前のファイル名に変更します。

サンプルツリー

A 
├── B 
│   ├── abc.zip.zip 
│   └── C 
│    └── file_C.zip 
└── one.zip 

サンプル出力

‘./t/A/one.zip’ -> ‘./t/A/one_A.zip’ 
‘./t/A/B/abc.zip.zip’ -> ‘./t/A/B/abc.zip_B.zip’ 

A 
├── B 
│   ├── abc.zip_B.zip 
│   └── C 
│    └── file_C.zip 
└── one_A.zip 
WORKDIR=./t

注意、私は意図的にfindコマンドを簡略化しました。なぜならアルゴリズムにとって重要ではないからです。必要に応じてオプションを調整できます。

関連する問題