rename
の使用 (prename
場合によっては) Perl と共にインストールされることもあるスクリプトの場合、Perl 式を使用して名前の変更を行うことができます。名前の競合がある場合、スクリプトは名前の変更をスキップします。
以下のコマンドは、4 桁以下の数字の後に「.txt」拡張子が続くファイルのみの名前を変更します。そのパターンに厳密に準拠していないファイルの名前は変更されません。 4 桁を超える名前は切り捨てられません。
rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *
いくつかの例:
Original Becomes
1.txt 0001.txt
02.txt 0002.txt
123.txt 0123.txt
00000.txt 00000.txt
1.23.txt 1.23.txt
これまでに与えられた他の回答は、パターンに準拠していないファイルの名前を変更しようとしたり、数字以外の文字を含むファイル名のエラーを生成したり、名前の衝突を引き起こす名前の変更を実行したり、名前にスペースが含まれるファイルの名前を変更しようとして失敗したりします。おそらく他の問題。
ワンライナー:
ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv
<ブロック引用> grep を使用して、\d.txt (IE 1 桁、次にピリオド、次に文字 txt) を含む行のみを一致させるにはどうすればよいですか?
grep -E '^[0-9]\.txt$'
試してみてください:
for a in [0-9]*.txt; do
mv $a `printf %04d.%s ${a%.*} ${a##*.}`
done
ファイル名のパターンを変更します ([0-9]*.txt
) 必要に応じて。
ファイル名の初期セットに関する仮定を行わない、汎用の列挙型の名前変更:
X=1;
for i in *.txt; do
mv $i $(printf %04d.%s ${X%.*} ${i##*.})
let X="$X+1"
done
同じトピックについて:
- ファイル名を埋め込む Bash スクリプト
- bash でファイル名と拡張子を抽出
for a in *.txt; do
b=$(printf %04d.txt ${a%.txt})
if [ $a != $b ]; then
mv $a $b
fi
done