
ファイル名に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" ] &&
既存のファイルを削除したくない場合は、このセクションを削除してください。
実際に実行する前に何をすべきかを確認するには、echo
beforeを追加してください。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
答え2
合格すると日付と時刻のスタンプ、ファイルの変更時間を意味する場合は、zsh
次のようにできます。
zmodload zsh/stat
autoload zmv
zmv -n '(*_*_)*(.txt)' '$1$(zstat -F %FT%T%z +mtime -- $f)$2'
(-n
実際に名前を変更するには削除してください)
シンボリックリンクファイルの場合、.txt
タイムスタンプはシンボリックリンク自体の修正時間ではなく、シンボリックリンクターゲットの修正時間に基づいています。シンボリックリンク自体の修正時間を使用-L
するオプションを追加します。zstat
%FT%T%z
明示的なローカルタイムスタンプを提供してください2016-09-13T17:32:17+0100
。例:必要に応じて標準形式を使用できますstrftime()
(と同じdate +<format>
)。ただし、1秒未満の精度はサポートされzsh
ていませんzstat
(修正時間を1秒未満の精度で保存するファイルシステムの場合)。
GNUシステムを使用している場合は、date -r
代わりにGNUを使用してzstat
次のナノ秒を取得できます。
$ zmv -n '(*_*_)*(.txt)' '$1$(date -r $f +%FT%T.%N%z)$2'
mv -- Abc_192.168.1.164_001.txt Abc_192.168.1.164_2016-09-13T17:32:17.368805094+0100.txt
同様にzstat
修正時間が必要です。ターゲットシンボリックリンク自体ではなく、シンボリックリンクのものです。date
シンボリックリンクでmtimeを使用するオプションはありませんが、find
代わりにGNUを使用できます。