可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a lot of files I'm trying to rename, I tried to make a regular expression to match them, but even that I got stuck on the files are named like:
File Name 01
File Name 100
File Name 02
File Name 03
etc, I would like to add a "0" (zero), behind any of file that are less than 100, like this:
File Name 001
File Name 100
File Name 002
File Name 003
The closest I got to so much as matching them was using this find -type d | sort -r | grep ' [1-9][0-9]$' however I could not figure out how to replace them. Thanks in advance for any help you can offer me. Im on CentOS if that is of any help, all this is being done via SSH.
回答1:
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'
A bit overkill maybe, but it does what is asked.
回答2:
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e'
or something like that, provided
- You have GNU find and GNU xargs (for
-print0
and -0
)
- You have the 'rename' utility that comes with perl
- There's only one group of digits in the filename. If there's more than one, then you need to do something with the regex to make it only match the number you want to reformat.
回答3:
Is this a one-time thing? If so, I'm going to suggest something that might seem to be a cop out by many programmers here:
Pipe the output of your command (find -type d | sort -r | grep ' [1-9][0-9]$'
) to a file and use an editor along with some global search/replace magic to create a script that does the renames.
Then throw away the script.
There's little fuss and little chance that you'll end up shooting yourself in the foot by having some attempt at a clever (but inadequately debugged) one-liner go off into the weeds on your files.
回答4:
Run two commands, in this order:
$ rename 's/File Name (\d)$/File Name 0$1/' *
$ rename 's/File Name (\d\d)$/File Name 0$1/' *
First one renames everything less than 10 and prepends a zero. The second one renames everything less than 100 and prepends a zero. The result should be three digits for all filenames.
回答5:
In my debian it works well with rename, tested with 300 files.
perl -e 'map `touch door$_.txt`, 1..300;'
rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt
回答6:
I think mmv is your friend here.
回答7:
you could do something using perl or ruby.
put all this files in the same directory
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
回答8:
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);
}
}
回答9:
if your remote has bash shell
for i in File*;
do
case "${i##* }" in [0-9][0-9] )
echo mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;;
esac;
done
remove "echo" to do actual renaming