6

名前を変更しようとしているファイルがたくさんあり、それらに一致する正規表現を作成しようとしましたが、ファイルに行き詰まったとしても、次のような名前が付けられています。

ファイル名01

ファイル名100

ファイル名02

ファイル名03

など、次のように、100未満のファイルの後ろに「0」(ゼロ)を追加したいと思います。

ファイル名001

ファイル名100

ファイル名002

ファイル名003

それらを一致させるのに最も近いのは、このfind -typed|を使用することでした。並べ替え-r| grep'[1-9] [0-9] $'しかし、それらを置き換える方法がわかりませんでした。あなたが私に提供することができるどんな助けにも前もって感謝します。CentOSでそれが助けになるなら、これはすべてSSH経由で行われています。

4

9 に答える 9

13
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'

多分少しやり過ぎかもしれませんが、それは求められていることを行います。

于 2009-12-02T23:33:28.780 に答える
10
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 

またはそのようなもの、提供

  1. GNUfindとGNUxargs(for-print0-0)があります
  2. perlに付属している「rename」ユーティリティがあります
  3. ファイル名には数字のグループが1つだけあります。複数ある場合は、再フォーマットする番号とのみ一致するように、正規表現を使用して何かを行う必要があります。
于 2009-12-02T23:24:15.563 に答える
4

これは一回限りのことですか?もしそうなら、私はここで多くのプログラマーによって警官のように見えるかもしれない何かを提案するつもりです:

コマンド()の出力をファイルにパイプしfind -type d | sort -r | grep ' [1-9][0-9]$'、エディターとグローバル検索/置換マジックを使用して、名前変更を行うスクリプトを作成します。

次に、スクリプトを破棄します。

巧妙な(ただし、デバッグが不十分な)ワンライナーをファイルの雑草に入れようとすると、大騒ぎすることはほとんどなく、自分の足を撃ってしまう可能性もほとんどありません。

于 2009-12-02T23:25:38.713 に答える
2

次の順序で2つのコマンドを実行します。

$ rename 's/File Name (\d)$/File Name 0$1/' *
$ rename 's/File Name (\d\d)$/File Name 0$1/' *

最初のものは、10未満のすべての名前を変更し、ゼロを付加します。2つ目は、100未満のすべての名前を変更し、ゼロを付加します。結果は、すべてのファイル名で3桁になるはずです。

于 2009-12-02T23:25:34.063 に答える
1

私のDebianでは、300ファイルでテストされたrenameでうまく機能します。

 perl -e 'map `touch door$_.txt`, 1..300;'
 rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt
于 2009-12-02T23:35:10.820 に答える
0

mmvはここであなたの友達だと思います。

于 2009-12-02T23:21:36.457 に答える
0

perlまたはrubyを使用して何かを行うことができます。

このすべてのファイルを同じディレクトリに配置します

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
于 2009-12-02T23:25:38.210 に答える
0
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);
    }
}
于 2009-12-02T23:34:46.700 に答える
0

リモコンにbashシェルがある場合

for i in File*; 
do 
    case "${i##* }" in  [0-9][0-9] ) 
      echo  mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;; 
    esac; 
done

「echo」を削除して実際の名前を変更します

于 2009-12-03T00:09:11.187 に答える