約1000個のファイルがあります。
20091208170014.nc
20091211150704.nc
20091214131328.nc
20091217111953.nc
20091220092643.nc
20091223073308.nc
20091226053932.nc
20091229034557.nc
20091208171946.nc
20091211152610.nc
最初の8桁は日付で、最後の6桁は連続した数字ですが、この数字の違いはファイルごとに同じではありません。私は最後の6つの数字が連続しており、常に同じステップを持つことを望みます。たとえば、
20091208000001.nc
20091211000002.nc
20091214000003.nc
20091217000004.nc
20091220000005.nc
20091223000006.nc
20091226000007.nc
20091229000008.nc
20091208000009.nc
20091211000010.nc
mmv
同様の方法でこのサイトでいくつかの質問を確認しました。https://www.ostechnix.com/how-to-rename-multiple-files-at-once-in-linux/しかし、それらのどれも私の名前に連続した数字を含める方法を説明できませんでした。
問題と区別するためにファイル名を連続した数字に一括変更、順次順序は最後の6桁に基づいている必要があり、最初の8桁に含まれる日付は完全に無視されます。
答え1
perl
ベースrename
ツール(時々呼び出される)がインストールされている場合は、prename
次のように1行でこれを実行できます。
rename -n 's/^(.{8})(.{6})\.(.*)/sprintf "%s%06d.%s", $1, ++$a, $3/e' *.nc
作成したとおり、これは何をすべきかを伝えます。満足のいく場合は、-n
自動実行を削除または交換し、-v
何が起こるかを確認してください。
気になる方は三(..)
部(ここでは文字を表し.{n}
、n
.*
何もない、括弧は、フォーマットされた印刷結果に最初のグループと増加する6桁の数字を含むグループを作成します。 (2番目のグループは使用されません。)3番目のグループにはファイル拡張子が含まれています。
既存のファイルの上書きを拒否することを指摘したいと思います。
サンプル出力
20091208170014.nc renamed as 20091208000001.nc
20091208171946.nc renamed as 20091208000002.nc
20091211150704.nc renamed as 20091211000003.nc
20091211152610.nc renamed as 20091211000004.nc
20091214131328.nc renamed as 20091214000005.nc
20091217111953.nc renamed as 20091217000006.nc
20091220092643.nc renamed as 20091220000007.nc
20091223073308.nc renamed as 20091223000008.nc
20091226053932.nc renamed as 20091226000009.nc
20091229034557.nc renamed as 20091229000010.nc
含まれている日付を完全に無視し、ファイル名の最後の6桁でソートしたいようです。ここにはいくつかのオプションがあります。
シェルがリストを完全に拡張できるほどファイル数が少ない場合、ファイルは次のようにソートされます。
rename -n '..as above..' $(ls -d *.nc | sort -k1.9,1.14n)
ソートキーが一時的にファイル名の前に配置され、名前が変更され、そのキーが属する場所が変更されるように変換が実行されます。
# Swap the first eight and second six groups around rename -n 's/^(.{8})(.{6})\.(.*)/$2$1.$3/' *.nc # Apply the transform with the shell sorting by original sequence rename -n 's/^(.{6})(.{8})\.(.*)/sprintf "%06d%s.%s", ++$a, $2, $3/e' *.nc # Swap back the first six and second eight groups rename -n 's/^(.{6})(.{8})\.(.*)/$2$1.$3/' *.nc
以前と同様に、削除し-n
て自動的に実行または交換して、-v
実際に何が起こるのかを確認してください。
答え2
Bashでは、衝突チェックなしで:
index=1
for file in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].nc
do
mv -- "$file" "${file:0:8}"$(printf "%06d" "$index").nc
((++index))
done
ワイルドカード[0-9]...
の選択には、8+6(14)桁の数字とが含まれます.nc
。これはこれらすべてのファイルを繰り返して名前を変更します。ターゲットファイル名は、次の3つの部分で生成されます。
"${file:0:8}"
- 既存のファイル名(日付)の最初の8文字$(printf "%06d" "$index")
- 6ビットゼロパディングインデックス.nc
- 既存の拡張
サンプルファイルで上記のループの「echo」バージョンを実行すると、次のような結果が得られます。
mv -- 20091208170014.nc 20091208000001.nc
mv -- 20091208171946.nc 20091208000002.nc
mv -- 20091211150704.nc 20091211000003.nc
mv -- 20091211152610.nc 20091211000004.nc
mv -- 20091214131328.nc 20091214000005.nc
mv -- 20091217111953.nc 20091217000006.nc
mv -- 20091220092643.nc 20091220000007.nc
mv -- 20091223073308.nc 20091223000008.nc
mv -- 20091226053932.nc 20091226000009.nc
mv -- 20091229034557.nc 20091229000010.nc