Bash命令从所有文件名中删除前导零

时间:2010-01-15 20:49:27

标签: bash sed file-rename

我有一个包含大量文件的目录,其名称如下:

001234.jpg
001235.jpg
004729342.jpg

我想从所有文件名中删除前导零,因此我将留下:

1234.jpg
1235.jpg
4729342.jpg

我一直在尝试不同的sed配置,但我找不到合适的语法。是否有一种简单的方法可以列出目录中的所有文件,通过sed管道,然后将它们移动或复制到新文件名而不带前导零?

8 个答案:

答案 0 :(得分:10)

sed本身就是错误的工具:你还需要使用一些shell脚本。

查看Rename multiple files with Linux页面了解一些想法。建议的一个想法是使用rename perl脚本:

rename 's/^0*//' *.jpg

答案 1 :(得分:8)

for FILE in `ls`; do mv $FILE `echo $FILE | sed -e 's:^0*::'`; done

答案 2 :(得分:7)

在Bash中,可能是您的默认登录shell,不需要外部命令。

shopt -s extglob
for i in 0*[^0]; do mv "$i" "${i##*(0)}"; done

答案 3 :(得分:1)

尝试使用sed,例如:

sed -e 's:^0*::'

完成循环:

for f in `ls`; do
   mv $f $(echo $f | sed -e 's:^0*::')
done

答案 4 :(得分:0)

也许不是最优雅但它会起作用。

for i in 0*
do
mv "${i}" "`expr "${i}" : '0*\(.*\)'`"
done

答案 5 :(得分:0)

我根本不知道sed,但您可以使用find

获取列表

find -type f -name *.jpg

所以用另一个答案可能看起来像是

find . -type f -name *.jpg | sed -e 's:^0*::'

但我不知道该sed命令是否成立。

答案 6 :(得分:0)

这是一个不需要sed的人:

for x in *.jpg ; do let num="10#${x%%.jpg}"; mv $x ${num}.jpg ;  done

请注意,仅当文件名是所有数字时,此方法才有效。您还可以使用shell删除前导零:

for a in *.jpg ; do dest=${a/*(0)/} ; mv $a $dest ; done

答案 7 :(得分:0)

在Bash shell中,你可以这样做:

shopt -s nullglob
for file in 0*.jpg
do
   echo mv "$file" "${file##*0}"
done