我有很多名字的文件 001ac.jpg 002ae.jpg 003.ag.jpg ... 012gf.jpg 我需要改变它们 001.jpg 002.jpg 003.jpg 004.jpg .... 012.jpg
我现在有一些解决方案,但我认为它们也是有线的。那么还有其他好的解决方案吗?
现在我有了这个:
#!/bin/sh
rename .jpg .89 *
for i in {a..z} do
rename $i '' *.jpg
rename $i '' *.jpg
done
rename .89 .jpg *
和此:
1 #!/bin/bash
2
3 for i in `find . -name "*.jpg"`
4 do
5 j=${i:0:5}
6 echo $j
7 mv $i $j.jpg
8 done
答案 0 :(得分:1)
这可能对您有用:
find . -name "*.jpg" |
sed -n 's|^\(\./[0-9]\+\)\([^0-9]\+\)\(\.jpg\)$|mv -v & \1\3|p' | sh
答案 1 :(得分:0)
你几乎就在那里,我会用你的循环从文件名中删除chars,即。
#!/bin/bash
for i in $( find . -name "*.jpg") ;do
new=$(echo "$i" | sed 's/[A-Za-z\.][A-Za-z\.]*//g')
echo $new
echo mv $i $new.jpg
done
如果您对此功能感到满意,请移除echo
前面的mv
。文件名中的任何空格都会搞砸,可能希望在精确命令结束时添加-printf0
。
另外,请勿使用反引号进行cmd替换。他们至少自1995年以来一直被弃用; - )
我希望这会有所帮助。
答案 2 :(得分:0)
我不太了解第一个解决方案。我不知道rename
命令。
如果您可以保证名称的确切格式,第二种解决方案可能会很好,但为什么${i:0:5}
中的长度为5而不是3?你给出的例子都有3位数的长度。并且,如果您正在进行查找,则不应将其置于for循环中。只需将其输入read
:
find . -name "*.jpg" | while read $name
do
newName=${name:0:3}
mv $name $newName.jpg
done
这是另一种可能的解决方案。它只是循环遍历你的所有数字。 printf
将数字格式化为零填充和三位数。在尝试重命名之前,if确保文件存在。
for number in {1..100}
do
zf_number=$(printf "%03d", $number) #Zero fill number
if [ -e ${zf_number}* ]
then
mv ${zf_number}* $zf_number.jpg
fi
done
这将依次遍历目录中的所有文件并重命名它们。 printf
零填充数字以匹配文件上的名称。
你是对的。但是,您最好删除文件的目录和基本名称,然后将它们重新组合在一起。这样,如果某些文件位于子目录中,则不会出现问题。因为find提供了这样的文件名:./001 ./002 ./003
find . -name "*.jpg" | while read $name
do
dirname=$(dirname $name)
basename=$(basename $name)
newName=${basename:0:3}
mv "$dirname/$basename" "$dirname/$newname.jpg"
done
答案 3 :(得分:0)
尝试以下脚本:
此代码段应该可以胜任:
./numerate.sh -d <your image folder> -b <start number> -L 3 -s .jpg -o numerically -r