使用Bash重命名表单中文件的最佳方法是什么:
(foo1, foo2, ..., foo1300, ..., fooN)
Run Code Online (Sandbox Code Playgroud)
使用零填充文件名:
(foo00001, foo00002, ..., foo01300, ..., fooN)
Run Code Online (Sandbox Code Playgroud)
KAR*_*ván 60
它不是纯粹的bash,但使用rename命令更容易:
rename 's/\d+/sprintf("%05d",$&)/e' foo*
Run Code Online (Sandbox Code Playgroud)
Chr*_*way 29
如果N不是先验固定:
for f in foo[0-9]*; do mv $f `printf foo%05d ${f#foo}`; done
Run Code Online (Sandbox Code Playgroud)
Mic*_*aks 18
我有一个更复杂的案例,文件名有一个后缀和一个前缀.我还需要对文件名中的数字进行减法.
例如,我想foo56.png成为foo00000055.png.
我希望如果你做的事更复杂,这会有所帮助.
#!/bin/bash
prefix="foo"
postfix=".png"
targetDir="../newframes"
paddingLength=8
for file in ${prefix}[0-9]*${postfix}; do
# strip the prefix off the file name
postfile=${file#$prefix}
# strip the postfix off the file name
number=${postfile%$postfix}
# subtract 1 from the resulting number
i=$((number-1))
# copy to a new name with padded zeros in a new folder
cp ${file} "$targetDir"/$(printf $prefix%0${paddingLength}d$postfix $i)
done
Run Code Online (Sandbox Code Playgroud)
纯 Bash,除了“mv”之外没有外部进程:
for file in foo*; do
newnumber='00000'${file#foo} # get number, pack with zeros
newnumber=${newnumber:(-5)} # the last five characters
mv $file foo$newnumber # rename
done
Run Code Online (Sandbox Code Playgroud)
我使用的oneline命令是这样的:
ls * | cat -n | while read i f; do mv "$f" `printf "PATTERN" "$i"`; done
Run Code Online (Sandbox Code Playgroud)
PATTERN可以是例如:
%04d.${f#*.}保留原始文件扩展名)photo_%04d.${f#*.}保留原始扩展名)%04d.jpgphoto_$(basename $f .${f#*.})_%04d.${f#*.}例如,您可以过滤要重命名的文件 ls *.jpg | ...
您可以使用作为f文件名的变量,i即计数器.
对于您的问题,正确的命令是:
ls * | cat -n | while read i f; do mv "$f" `printf "foo%d05" "$i"`; done
Run Code Online (Sandbox Code Playgroud)
在文件名中左键盘数字:
$ ls -l
total 0
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 010
-rw-r--r-- 1 victoria victoria 0 Mar 28 18:09 050
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 050.zzz
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 10
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 1.zzz
$ for f in [0-9]*.[a-z]*; do tmp=`echo $f | awk -F. '{printf "%04d.%s\n", $1, $2}'`; mv "$f" "$tmp"; done;
$ ls -l
total 0
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 0001.zzz
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 0050.zzz
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 010
-rw-r--r-- 1 victoria victoria 0 Mar 28 18:09 050
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 10
Run Code Online (Sandbox Code Playgroud)
解释
for f in [0-9]*.[a-z]*; do tmp=`echo $f | \
awk -F. '{printf "%04d.%s\n", $1, $2}'`; mv "$f" "$tmp"; done;
Run Code Online (Sandbox Code Playgroud)
`echo ... $2}\` 反斜杠,\,正上方只是将一行行拆分为两行以提高可读性)[0-9]*.[a-z]*$f) 以将其传递给awk-F.:awk字段分隔符,句点 ( .):如果匹配,则将文件名分隔为两个字段 ( $1= number; $2= 扩展名)printf:将第一个字段($1,数字部分)%04d打印为 4 位数字 ( ),然后打印句点,然后将第二个字段 ( $2: 扩展名)打印为字符串 ( %s)。所有这些都分配给$tmp变量$f)移动到新文件名 ( $tmp)