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

12

我有一个目录,里面有很多文件,它们的名称都像这样:

001234.jpg
001235.jpg
004729342.jpg

我想从所有的文件名中删除前导零,这样我就只剩下:

1234.jpg
1235.jpg
4729342.jpg

我一直在尝试不同的sed配置,但是我找不到合适的语法。有没有一��简单的方法可以列出目录中所有文件,将它们通过sed进行处理,并将它们移动或复制到新文件名,而不包括前导零?


1
注意:这将使排序变得更加困难。 - Evan Carroll
1
使用GNU coreutils,ls -v将自然排序数字(使用Glibc扩展versionsort(3)/strverscmp(3))。但是,一般来说,更改文件名的数字部分以使其不再按长度对齐会改变正常的排序顺序。 - ephemient
8个回答

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

2
你不需要(也不应该)像这样使用 ls。请使用以下方式:for FILE in * - Dennis Williamson
1
这是一个糟糕的例子。首先使用ls,然后永远不要引用你的变量。 - ghostdog74
我认为使用ls没有任何问题。你可以将其替换为下面建议的find命令或其他命令。既然它能工作,我真的不太明白除了风格上的问题之外,你的正当理由是什么,尤其是对于单行Shell脚本来说,这似乎有点无意义。 - cyborg
  • 会做正确的事情,ls 有时候不会(例如,如果文件名中有空格,这个脚本就无法工作)。
- Justin Smith
我的经验并没有展现出那种行为。如果我自己指定列表,项目需要用换行符分隔。 - cyborg

13

sed单独使用并不适合这种情况:您需要同时使用一些Shell脚本。

请查看Linux下批量重命名文件页面以获取一些想法。其中建议之一是使用rename Perl脚本:

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

1
我喜欢那个命令,但不幸的是它并没有安装在每个系统上 :(。 - Kaleb Pederson
@BryanH:?? 这不是维基百科,所以我不确定你放xkcd漫画的原因。我想我当时试图表达的观点是sed本身无法重命名文件——你需要一些额外的脚本来完成它。 - Simon Nickerson
可以证实,在安装了rename工具(Mac)后,这个方法是可行的。 - Husky
prename on Fedora (38). - user598527

8
在Bash中,这很可能是您的默认登录shell,不需要外部命令。
shopt -s extglob
for i in 0*[^0]; do mv "$i" "${i##*(0)}"; done

1

尝试使用sed,例如:

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

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

这对于George的情况可能已经足够好了,但在不同的环境中,人们可能希望处理文件名全为零的特殊情况。 - Jim Lewis
3
使用 for f in * 比起 for f in \ls`` 更加安全高效,没有任何理由使用后者。请注意不要改变原文意思。 - ephemient

1

也许不是最优雅的,但它能够工作。

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

你的格式需要改进。使用4个空格在“for”之前,使整行成为代码部分。 - bradlis7

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

0
在Bash shell中,您可以执行以下操作:
shopt -s nullglob
for file in 0*.jpg
do
   echo mv "$file" "${file##*0}"
done

0
我完全不懂sed,但是您可以使用find获得列表: find -type f -name *.jpg 因此,与其他答案一起,它可能看起来像: find . -type f -name *.jpg | sed -e 's:^0*::' 但我不知道那个sed命令是否可行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接