Unixフォルダの複数のファイル名から複数の文字を置き換える

Unixフォルダの複数のファイル名から複数の文字を置き換える

私のUnixフォルダに/home/TRANSという名前のファイルがいくつかあります。

このフォルダは毎月ファイルを受け取ります。ファイル名は次のとおりです。

  • ENCD_213_E-DM_CCA_ID3490_A01.txt
  • ENCD_213_E-DM_CCA_ID33120_A01.txt
  • ENCD_213_E-DM_CCA_IDP3664_A01.txt
  • ENCD_213_E-DM_CCA_ID3327_A01.txt
  • ENACT_215_E_DM_CCA_IDA33320_25OCT2017.csv
  • ENACT_215_E_DM_CCA_IDA31116_25OCT2017.csv

名前を変更した後、最終出力は次のようになります。

  • id3490.txt
  • id33120.txt
  • idp3664.txt
  • id3327.txt
  • ida33320.csv
  • ida31116.csv

したがって、デフォルトでは、TRANSフォルダ内のすべてのファイル名で次の文字列を変更し、最終出力ファイル名を小文字にしたいと思います。

  • ENCD_213_E-DM_CCA_
  • _A01
  • ENACT_215_E_DM_CCA_
  • _2017年10月25日

1行のコマンドまたはシェルスクリプトでこれをどのように実行できますか?複数の質問を確認しましたが、小文字に変更する以外に複数の文字を置き換えることはできません。私はUnixに初めて触れたので、あなたの助けが必要です。

ベストアンサー1

これを行う方法はいくつかあります。あなたの例に適したコマンドは次のとおりです。

for oldname in *; do
    newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z).txt" \
    && mv -i "${oldname}" "${newname}";
done

grepこの例では、サポートされていないように見えるPerl準拠の正規表現を使用しています。以下は、基本正規表現を使用する代替方法です。

for oldname in *; do
    newname="$(echo "${oldname}" | grep -o 'ID[A-Z]\?[0-9]\+' | tr A-Z a-z).txt" \
    && mv -i "${oldname}" "${newname}";
done

以下は、より詳細な説明です。


この表現は以下for oldname in *を使用します。ワイルドカードパターン/ワイルドカード現在のディレクトリのファイルを繰り返し、各名前をoldname変数に保存します。これをテストするには、次のコマンドを実行できます。

for oldname in *; do echo "${oldname}"; done

grep次に、保持したいファイル名の部分を抽出するために使用します。オプション-PフラグはgrepPerl互換正規表現を使用するように指示します(この場合は実際には必要ありません)、フラグは文字列全体を印刷するのではなく、一致する部分文字列のみを抽出するように指示-oします。grepパターン\w?はオプションの単一文字(「単語」文字)と一致し、\d+パターンは1つ以上の数字と一致します。次のように正規表現をテストできます。

for oldname in *; do echo "${oldname}" | grep -Po 'ID\w?\d+'; done

次に、tr次を使用して大文字を小文字に変換します。

for oldname in *; do echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z; done

次のステップは使用することです。コマンドの置き換えこの文字列を変数に割り当て、結果を印刷します。

for oldname in *; do
    newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z)" && echo "${newname}"
done

次に、「.txt」ファイル拡張子を追加します。

for oldname in *; do
    newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z).txt" && echo "${newname}"
done

このコマンドを完全性チェックとして実行して、期待した結果が得られるかどうかを確認できます。うまくいけば、echoそのコマンドを次のように置き換えますmv

for oldname in *; do
    newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z).txt" \
    && mv -i "${oldname}" "${newname}";
done

おすすめ記事