使用有线名称重命名这些文件

时间:2011-11-17 04:24:53

标签: bash

我有很多名字的文件 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

4 个答案:

答案 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

此代码段应该可以胜任:

./numerate.sh -d <your image folder> -b <start number> -L 3 -s .jpg -o numerically -r
相关问题