10

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

001234.jpg
001235.jpg
004729342.jpg

我想从所有文件名中删除前导零,所以我会留下:

1234.jpg
1235.jpg
4729342.jpg

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

4

8 回答 8

14
for FILE in `ls`; do mv $FILE `echo $FILE | sed -e 's:^0*::'`; done
于 2010-01-15T20:58:30.267 回答
11

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

检查Rename multiple files with Linux page 以获得一些想法。建议的想法之一是使用renameperl 脚本:

rename 's/^0*//' *.jpg
于 2010-01-15T20:59:16.407 回答
8

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

shopt -s extglob
for i in 0*[^0]; do mv "$i" "${i##*(0)}"; done
于 2010-01-15T21:43:59.063 回答
1

尝试使用sed,例如:

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

完整循环:

for f in `ls`; do
   mv $f $(echo $f | sed -e 's:^0*::')
done
于 2010-01-15T20:52:16.373 回答
1

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

for i in 0*
do
mv "${i}" "`expr "${i}" : '0*\(.*\)'`"
done
于 2010-01-15T20:57:23.020 回答
0

In Bash shell you can do:

shopt -s nullglob
for file in 0*.jpg
do
   echo mv "$file" "${file##*0}"
done
于 2010-01-15T23:59:21.210 回答
0

我根本不知道 sed,但您可以使用以下方法获取列表find

find -type f -name *.jpg

因此,对于其他答案,它可能看起来像

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

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

于 2010-01-15T20:57:23.183 回答
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
于 2010-01-15T21:17:05.183 回答