部分パス名を使用したファイル名の変更

部分パス名を使用したファイル名の変更

ディレクトリ名の一部を使用してすべてのログの名前を変更する必要があります。

ログは次のとおりです。

friday13/stack123/FooBar-QA-123/000001.gz
friday13/stack123/FooBar-QA-123/000002.gz
friday13/stack123/FooBar-QA-123/000003.gz

friday13/stack123/FooBar-Stage-456/000001.gz
friday13/stack123/FooBar-Stage-456/000002.gz
friday13/stack123/FooBar-Stage-456/000003.gz

friday13/stack123/FooBar-Prod-789/000001.gz
friday13/stack123/FooBar-Prod-789/000002.gz
friday13/stack123/FooBar-Prod-789/000003.gz

上記のディレクトリの各ファイルの名前を次のように変更する必要があります。

FooBar-QA-123-000001.gz
FooBar-QA-123-000002.gz
FooBar-QA-123-000003.gz

FooBar-Stage-456-000001.gz
FooBar-Stage-456-000002.gz
FooBar-Stage-456-000003.gz

FooBar-Prod-789-000001.gz
FooBar-Prod-789-000002.gz
FooBar-Prod-789-000003.gz

事前に助けてくれてありがとう!

答え1

パラメータ拡張の使用部分文字列の削除mv返された各ファイル名のコマンドのターゲット引数を生成するには、次の手順を実行しますfind

find . -type f -name '*.gz' -exec sh -c 'mv -- "$1" "${1%/*}-${1##*/}"' sh {} \;

または同様に、以下を使用しdirnameてくださいbasename

find . -type f -name '*.gz' -exec sh -c '
    mv -- "$1" "$(dirname "$1")-$(basename "$1")"
' sh {} \;

注:常に同様のコマンドを最初に置き換えてmvテストしてください。echo

答え2

明らかにthanasispの答えはあなたの投稿とあなたが提供したサンプル出力に基づいていますが、/に変わりません-。あなたの投稿の下に添付されたコメントから予想される全体的な処理を得るには、次のようにします。ファイルを保存してください。デフォルト名は6番目の文字で始まります...

興味のあるファイルの検出が次のような場合に役立つ場合:

$ find friday13 -type f -name "*.gz"

(上記のデフォルトのcmdが正しく機能していることを確認する必要があります。find)cmd全体は次のとおりです。

$ find friday13 -type f -name '*.gz' -exec bash -c '
      var=$(sed "s/\//-/g;s/^\.-//" < <(echo $1));
      echo mv -- "$1" "${var%-*}-$(cut -c6- < <(echo ${var##*-}))"
      ' execbash {} \;

echo印刷されたコマンドが必要に応じて実行されることを確認したら、上記のコードスニペットからコマンドを削除するだけですmv

関連情報