我有一个目录,里面有很多文件,它们的名称都像这样:
001234.jpg
001235.jpg
004729342.jpg
我想从所有的文件名中删除前导零,这样我就只剩下:
1234.jpg
1235.jpg
4729342.jpg
我一直在尝试不同的sed配置,但是我找不到合适的语法。有没有一��简单的方法可以列出目录中所有文件,将它们通过sed进行处理,并将它们移动或复制到新文件名,而不包括前导零?
我有一个目录,里面有很多文件,它们的名称都像这样:
001234.jpg
001235.jpg
004729342.jpg
我想从所有的文件名中删除前导零,这样我就只剩下:
1234.jpg
1235.jpg
4729342.jpg
我一直在尝试不同的sed配置,但是我找不到合适的语法。有没有一��简单的方法可以列出目录中所有文件,将它们通过sed进行处理,并将它们移动或复制到新文件名,而不包括前导零?
for FILE in `ls`; do mv $FILE `echo $FILE | sed -e 's:^0*::'`; done
ls
。请使用以下方式:for FILE in *
- Dennis Williamsonls
有时候不会(例如,如果文件名中有空格,这个脚本就无法工作)。sed
单独使用并不适合这种情况:您需要同时使用一些Shell脚本。
请查看Linux下批量重命名文件页面以获取一些想法。其中建议之一是使用rename
Perl脚本:
rename 's/^0*//' *.jpg
rename
工具(Mac)后,这个方法是可行的。 - Huskyprename
on Fedora (38). - user598527shopt -s extglob
for i in 0*[^0]; do mv "$i" "${i##*(0)}"; done
尝试使用sed
,例如:
sed -e 's:^0*::'
for f in `ls`; do
mv $f $(echo $f | sed -e 's:^0*::')
done
for f in *
比起 for f in \
ls`` 更加安全高效,没有任何理由使用后者。请注意不要改变原文意思。 - ephemient也许不是最优雅的,但它能够工作。
for i in 0*
do
mv "${i}" "`expr "${i}" : '0*\(.*\)'`"
done
这里是一个不需要 sed
的例子:
for x in *.jpg ; do let num="10#${x%%.jpg}"; mv $x ${num}.jpg ; done
for a in *.jpg ; do dest=${a/*(0)/} ; mv $a $dest ; done
shopt -s nullglob
for file in 0*.jpg
do
echo mv "$file" "${file##*0}"
done
find
获得列表:
find -type f -name *.jpg
因此,与其他答案一起,它可能看起来像:
find . -type f -name *.jpg | sed -e 's:^0*::'
但我不知道那个sed命令是否可行。
ls -v
将自然排序数字(使用Glibc扩展versionsort(3)/strverscmp(3)
)。但是,一般来说,更改文件名的数字部分以使其不再按长度对齐会改变正常的排序顺序。 - ephemient