複数のファイルの名前を変更するUnixコマンド

複数のファイルの名前を変更するUnixコマンド

plugin-cfg.xmlバックアップして同じディレクトリに保存したい他のファイルを含むいくつかのディレクトリがあります。

例えば

Plug6_a1/plugin-cfg.xml
Plug6_a2/plugin-cfg.xml
Plug6_a3/plugin-cfg.xml

各ディレクトリにplugin-cfg.xml名前変更をコピーする方法は?plugin-cfgbk.xml

答え1

find Plu*_a* -type f -name plugin-cfg.xml -exec \
  sh -c 'cp "$1" "$(dirname "$1")"/plugin-cfgbk2.xml ' sh {} \;  

名前で始まり、含まれているディレクトリー内の各ファイルのplugin-cfg.xml同じディレクトリーにコピーを作成します。Plu_aplugin-cfg.xmlplugin-cfgbk2.xml

答え2

dest=/path/to/backup/destination;
find plu6_a1 plu61_a2 -type f -iname '*.xml' -print0 | while IFS= read -rd '' f; do
    cp -- "$f" "${dest%/}/${f%.xml}-bk.xml"
done

plu6_a1 plu61_a2で各XMLファイルを見つけてコピーを作成し、コピーにサフィックス-bk.xmlを追加してから「$ dest」に移動します。

編集:このコードはBashで書かれており、GNUまたはBSD find(1)も必要です。

答え3

必要な行は次のようになります/bin/sh(ただし、これは単一のディレクトリでのみ機能します)。

for f in ./*.xml; do cp "$f" "${f%cfg.xml}cfgbk.xml"; done

bash 4+があると仮定すると(わからない場合はおそらく知っているでしょう。確認bash --version)、再帰にglobstarを使用できます。

shopt -s globstar
for f in ./**/*.xml; do cp "$f" "${f%cfg.xml}cfgbk.xml"; done

ただし、バックアップに対してより明確な命名スキームを採用することを検討することもできます。私はファイル名に「.backup」のようなものを追加することを好みます。

shopt -s globstar
for f in ./**/*.xml; do cp "$f" "$f".backup; done

関連情報