Perl を使用してファイルの名前を簡単に一括変更するにはどうすればよいですか?
質問
名前を変更しようとしているファイルがたくさんあり、それらに一致する正規表現を作成しようとしましたが、それでもファイルの名前が次のようなものになってしまいました。
ファイル名01
ファイル名 100
ファイル名02
ファイル名03
など、次のように 100 未満のファイルの後ろに「0」(ゼロ)を追加したいと思います。
ファイル名001
ファイル名 100
ファイル名002
ファイル名003
それらに一致するのに最も近いのは、このFind -Type D |を使用することでした。 sort -r | grep '[1-9] [0-9] $'ただし、それらを交換する方法を理解できませんでした。何かございましたら、よろしくお願いいたします。私は CentOS を使用していますが、これはすべて SSH 経由で行われています。
解決
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'
多分ビット行き過ぎ、それが求められているものを行います。
他のヒント
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e'
またはそのようなもの、ただし
- GNU find と GNU xargs があります (
-print0
そして-0
) - Perl に付属の「名前変更」ユーティリティがあります
- ファイル名に含まれる数字のグループは 1 つだけです。複数ある場合は、再フォーマットする数値のみに一致するように正規表現を使用する必要があります。
これは1回限りの事ですか?もしそうなら、私はここで多くのプログラマによって警官アウトのように見えるかもしれない何かを提案するつもりです。
パイプファイルへのごコマンド(find -type d | sort -r | grep ' [1-9][0-9]$'
)の出力と、名前の変更を行うスクリプトを作成するために、マジックを置き換える/いくつかのグローバル検索と一緒にエディタを使用します。
次に、スクリプトを捨てます。
少し大騒ぎとあなたは賢い(が不十分デバッグ)ワンライナーは、あなたのファイルの雑草にオフに行くのいくつかの試みを持つことで足に自分自身を撮影し終わるだろうことはほとんどチャンスがあります。
このためには、2つのコマンドを実行します:
$ rename 's/File Name (\d)$/File Name 0$1/' *
$ rename 's/File Name (\d\d)$/File Name 0$1/' *
まず一つが10未満のすべての名前を変更し、ゼロを付加します。もう一つは100未満のすべての名前を変更し、ゼロを付加します。その結果、すべてのファイル名の3桁の数字である必要があります。
私のdebianでは、300個のファイルでテストし、リネーム、とうまく動作します。
perl -e 'map `touch door$_.txt`, 1..300;'
rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt
私は MMV には、ここにあなたの友人だと思います。
あなたはPerlやルビーを使って何かをすることができます。
同じディレクトリにこのすべてのファイルを置く
dirlisting = DIR.entries('.')
dirListing.each do |file|
num = file.match(/\d+$/).to_i
if num < 100
find the position where start the number, with index and inject the 0 there.
end
end
use strict;
use File::Copy;
my @files = glob 'File*Name*';
foreach my $filename (@files) {
if ($filename =~ m`^.*File.*Name.*?(\d+)`) {
my $number = $1;
next if ($number > 99);
rename $filename, sprintf("FileName%03d",$number);
}
}
リモートbashシェルを持っている場合は、
for i in File*;
do
case "${i##* }" in [0-9][0-9] )
echo mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;;
esac;
done
実際の名前の変更
を行うために "エコー" を削除