番号の変更と名前の変更

番号の変更と名前の変更

次の形式で多数のファイル名を変更する必要がある状況が発生しました。

file.csv
file_1.csv
file_2.csv
file_3.csv
file_4.csv
file_5.csv
file_6.csv
file_7.csv
file_8.csv

より良いソートのためには、次のものが必要です。

file_1.csv
file_2.csv
file_3.csv
file_4.csv
file_5.csv
file_6.csv
file_7.csv
file_8.csv
file_9.csv

つまり、最初のファイルの名前を手動で変更することができますが、残りの " _#"ファイルについては+1

rename -n -v 's/_(.*)./.(\1+1)./' 

しかし、得た

file_(1+1).csv
file_(2+1).csv

など。

_#""ファイルを一括して保持する簡単な方法はありますか?

PS、まだ良いです

file_01.csv
. . .
file_09.csv
file_10.csv
. . .

可能であれば。

修正する:

答えてくれてありがとう。 0で埋められた名前に名前を変更したため、ファイル名が競合しないため、コマンドは次のように単純化されました。

touch file.csv file_{1..9}.csv

$ rename -v 's/^(file_)(\d+)(\.csv)$/$1 . (sprintf "%02i", $2 + 1) . $3/e' file_*
file_1.csv renamed as file_02.csv
file_2.csv renamed as file_03.csv
file_3.csv renamed as file_04.csv
file_4.csv renamed as file_05.csv
file_5.csv renamed as file_06.csv
file_6.csv renamed as file_07.csv
file_7.csv renamed as file_08.csv
file_8.csv renamed as file_09.csv
file_9.csv renamed as file_10.csv

最後の2つのファイル名を参照してください。

file_09.csv
file_10.csv

ベストアンサー1

Perlの正規表現修飾子を使用して、/e操作の右側をs///Perl式として評価する必要があります。

ファイル名もソートする必要があります。キャンセル最も高い番号のファイル名を変更するための番号の順序今後低い番号のファイル名(それ以外の場合はファイル名の競合が発生します。デフォルトでは、これを行うには、NUL終了入力に-fGNU renamewithfind-print0GNU sortwithを使用し、リバースバージョン(つまり「自然」)ソートを使用します。フィールドの並べ替えにも使用されます。-z-r-V-t _-k 2

[名前の変更]オプションを-d使用すると、パス名のファイル名部分のみが名前変更され、-0標準入力でNULで区切られたファイルのリストが使用されます。

例えば

$ touch file.csv file_{1..8}.csv
$ find . -name 'file_*.csv' -print0 |
    sort -z -t _ -k2 -r -V |
    rename -d -0 's/^(file_)(\d+)(\.csv)$/$1 . ($2 + 1) . $3/e'
$ mv file.csv file_1.csv
$ ls -l
total 5
-rw-r--r-- 1 cas cas 0 Aug 21 15:22 file_1.csv
-rw-r--r-- 1 cas cas 0 Aug 21 15:22 file_2.csv
-rw-r--r-- 1 cas cas 0 Aug 21 15:22 file_3.csv
-rw-r--r-- 1 cas cas 0 Aug 21 15:22 file_4.csv
-rw-r--r-- 1 cas cas 0 Aug 21 15:22 file_5.csv
-rw-r--r-- 1 cas cas 0 Aug 21 15:22 file_6.csv
-rw-r--r-- 1 cas cas 0 Aug 21 15:22 file_7.csv
-rw-r--r-- 1 cas cas 0 Aug 21 15:22 file_8.csv
-rw-r--r-- 1 cas cas 0 Aug 21 15:22 file_9.csv

これは少し簡単になるかもしれませんが、ファイル名file_を変更しないでください。.csv

ファイル番号をゼロで埋めるには、このsprintf機能を使用します。例えば

... | rename -0 -d -v 's/^(file_)(\d+)(\.csv)$/$1 . (sprintf "%02i", $2 + 1) . $3/e'
Reading filenames from file handle (GLOB(0x555555905960))
./file_8.csv renamed as ./file_09.csv
./file_7.csv renamed as ./file_08.csv
./file_6.csv renamed as ./file_07.csv
./file_5.csv renamed as ./file_06.csv
./file_4.csv renamed as ./file_05.csv
./file_3.csv renamed as ./file_04.csv
./file_2.csv renamed as ./file_03.csv
./file_1.csv renamed as ./file_02.csv

おすすめ記事