部品を保持しながらファイル名を変更する

部品を保持しながらファイル名を変更する

ファイル名にIPアドレスを保持しながら、複数のファイルの一部の名前を変更する必要があります。

例えば、

Abc_192.168.1.164_001.txt
Abc_10.11.76.112_001.txt
Abc_54.78.1.1_002.txt

IPアドレスだけでなく、「Abc_」部分も維持する必要があります。それ以降のすべての内容は日付とタイムスタンプに置き換えられます。現在の日付とタイムスタンプを「_yymmdd-yymmdd-hhmmss」として追加し、拡張子を「.csv」に変更します。これはLinuxで実行されます。

ベストアンサー1

以下は、あなたが要求したようにファイル名を(慎重に)変更する簡単なシェルループです。

d=$(date +%y%m%d-%y%m%d-%H%M%S)
for f in Abc_*.*.*.*_*.txt
do
  new=${f%_*}_${d}.csv
  [ ! -f "$new" ] && mv "$f" "$new"
done

まず、作成した形式で名前付き変数にタイムスタンプをキャプチャしますd。次に、単純なglob形式を繰り返して、名前が「Abc_」で始まるすべてのファイルを選択し、3つのピリオドのすべてのファイル、アンダースコア、その他の項目、最後に「.txt」の終わりで終わるファイルを選択します。

最後のアンダースコア(および含む)の後のすべてのエントリを削除し、タイムスタンプ(${d})と新しい ".csv"拡張子を追加して新しいファイル名を計算します。

新しいファイル名が次の場合いいえ存在する場合、ファイル名が変更されます。[ ! -f "$new" ] &&既存のファイルを削除したくない場合は、このセクションを削除してください。

実際に実行する前に何をすべきかを確認するには、echobeforeを追加してください。mv

私がそれを実行すると、以下が表示されます。

$ touch Abc_10.11.76.112_001.txt Abc_192.168.1.164_001.txt Abc_54.78.1.1_002.txt
$ d=$(date +%y%m%d-%y%m%d-%H%M%S)
$ for f in Abc_*.*.*.*_*.txt; do new=${f%_*}_${d}.csv; [ ! -f "$new" ] && mv "$f" "$new"; done
$ ls -1
Abc_10.11.76.112_160913-160913-140649.csv
Abc_192.168.1.164_160913-160913-140649.csv
Abc_54.78.1.1_160913-160913-140649.csv

おすすめ記事