1つのディレクトリ内のファイルに番号を追加するにはどうすればよいですか?
1つのディレクトリには、次のようなファイルがあります。
fileA
fileB
fileC
fileD
次のように、昇順の番号を追加します。
1_fileA
2_fileB
3_fileC
4_fileD
前もって感謝します。
解決策の1つ:
cd <your dir>
次にbashで実行します(コマンドラインでコピーして貼り付けます):
n=1; for f in *; do mv "$f" "$((n++))_$f"; done
Bashスクリプトケース:
#!/bin/bash
n=1
for f in *
do
if [ "$f" = "rename.sh" ]
then
continue
fi
mv "$f" "$((n++))_$f"
done
rename.sh
として名前を付けて、名前を変更するファイルを含むディレクトリに保存し、chmod +x rename.sh
を実行してから./rename.sh
を実行します
9個以上のファイルがある場合、printf
を使用して番号をパディングし、次のように予想されるソート順を取得します
n=0
for f in *
do printf -v new "%2d$((++n))_$f"
echo mv -v -- "$f" "$new"
done
正しい結果が表示されたら、echo
を削除します。
この行では、do printf -v new "%2d$((++n))_$f"
新しいファイル名のフォーマットを作成し、それを変数new
に入れます。
%2d
は2桁の10進数です。 2d
の代わりに、3d
などを使用して、先頭の別の0を取得できます(99を超えるファイルがある場合)。
((++n))
は、変数n
(スクリプトの開始時に0に設定します)をインクリメントします。ループが実行されるたびに1回繰り返されるため、ファイルには名前のプレフィックスが追加されます。
-v
は、変更される内容をmv
に出力します。
mv
ステートメントの--
は、-
で始まるファイル名がオプションとして解釈されるのを防ぐためのものです。
file-rename
の仕事です (別名Perlの名前変更):
file-rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
これは変数を定義し、設定されていない場合は増加し(そうでない場合は0
の代わりに1
で始まる)、ファイル名の先頭を毎回増加する番号に置き換えます。形式は簡単に変更できます。 3桁(001
、002
、…)にするには、"%03d_"
を使用します。 -n
を指定して実行すると、変更のみが出力され、実際に名前を変更してこのフラグを削除します。
代替システムを使用すると、rename
は私のシステムのfile-rename
にリンクされます。
$ ls -1
fileA
fileB
fileC
fileD
$ rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
rename(fileA, 1_fileA)
rename(fileB, 2_fileB)
rename(fileC, 3_fileC)
rename(fileD, 4_fileD)
$ rename 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
$ ls -1
1_fileA
2_fileB
3_fileC
4_fileD
1つのオプションは
cd /path/to/folder/
ls -1v | rename -n -v 's/^/sprintf("%02d_", ++our$i)/e'
改行「\ n」のあるファイル名を除き、これは正常に機能します。スイッチ「-1v」はスペースとタブを処理し、
ここに投稿された他のコマンドは、数字の付いたファイルの順序を変更します。 10aは1aの前に来ます。
状況に合った方。
これらすべてのコマンドをテストする時間がありました。結果は次のとおりです。
$ ls
001abc.txt '10a bc.txt' 1abc.txt '2ab c.txt' 'a'$'\t''bc.txt'
$ ls -1v | rename -n -v 's/^/sprintf("%02d_", ++our$i)/e'
Reading filenames from file handle (GLOB(0x55cb57991b28))
rename(001abc.txt, 01_001abc.txt)
rename(1abc.txt, 02_1abc.txt)
rename(2ab c.txt, 03_2ab c.txt)
rename(10a bc.txt, 04_10a bc.txt)
rename(a bc.txt, 05_a bc.txt)
$ n=1; for f in *; do echo mv "$f" "$((n++))_$f"; done
mv 001abc.txt 1_001abc.txt
mv 10a bc.txt 2_10a bc.txt
mv 1abc.txt 3_1abc.txt
mv 2ab c.txt 4_2ab c.txt
mv a bc.txt 5_a bc.txt
$ for f in *; do printf -v new "%2d$((++n))_$f"; echo mv -v -- "$f" "$new"; done
mv -v -- 001abc.txt 09_001abc.txt
mv -v -- 10a bc.txt 010_10a bc.txt
mv -v -- 1abc.txt 011_1abc.txt
mv -v -- 2ab c.txt 012_2ab c.txt
mv -v -- a bc.txt 013_a bc.txt
$ ./rename.sh
mv 001abc.txt 1_001abc.txt
mv 10a bc.txt 2_10a bc.txt
mv 1abc.txt 3_1abc.txt
mv 2ab c.txt 4_2ab c.txt
mv a bc.txt 5_a bc.txt
$ rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
rename(001abc.txt, 1_001abc.txt)
rename(10a bc.txt, 2_10a bc.txt)
rename(1abc.txt, 3_1abc.txt)
rename(2ab c.txt, 4_2ab c.txt)
rename(a bc.txt, 5_a bc.txt)
rename(rename.sh, 6_rename.sh)
$ for f in *; do printf -v new "%2d$((++n))_$f"; echo mv -v -- "$f" "$new"; done
mv -v -- 001abc.txt 01_001abc.txt
mv -v -- 10a bc.txt 02_10a bc.txt
mv -v -- 1abc.txt 03_1abc.txt
mv -v -- 2ab c.txt 04_2ab c.txt
mv -v -- a bc.txt 05_a bc.txt
mv -v -- rename.sh 06_rename.sh