批量重命名文件

时间:2014-03-17 13:42:02

标签: shell rename

我无法在shell中重命名图像序列。

我在模式myimage_001.jpg之后有大约300个文件,我想将其转换为myimage.0001.jpg,其中数字随每个文件递增。

这是我尝试过但没有成功(-n标志在实际应用之前显示结果):

rename -n 's/_/./g' *.jpg

3 个答案:

答案 0 :(得分:1)

您可以尝试以下内容:

for file in *.jpg; do 
    name="${file%_*}" 
    num="${file#*_}"
    num="${num%.*}"
    ext="${file#*.}"
    mv "$file" "$(printf "%s.%04d.%s" $name $num $ext)"
done

这给出了:

$ ls
myimage_001.jpg  myimage_002.jpg

$ for file in *.jpg; do 
  name="${file%_*}" 
  num="${file#*_}"
  num="${num%.*}"
  ext="${file#*.}"
  mv "$file" "$(printf "%s.%04d.%s" $name $num $ext)"
done

$ ls
myimage.0001.jpg  myimage.0002.jpg

答案 1 :(得分:1)

尝试此命令:

rename _ . *.jpg

示例:

> touch myimage_001.jpg
-rw-r--r-- 1 oracle oinstall      0 Mar 17 10:55 myimage_001.jpg
> rename  _ . *.jpg
> ll
-rw-r--r-- 1 oracle oinstall      0 Mar 17 10:55 myimage.001.jpg

额外的0:

> touch myimage_001.jpg
-rw-r--r-- 1 oracle oinstall      0 Mar 17 10:55 myimage_001.jpg
> rename  _ .0 *.jpg
> ll
-rw-r--r-- 1 oracle oinstall      0 Mar 17 10:55 myimage.0001.jpg

语法很简单:

rename 'old' 'new' 'data-source'

答案 2 :(得分:1)

另一种选择:

$ touch a.txt  b.txt  c.txt  d.txt  e.txt  f.txt
$ ls
a.txt  b.txt  c.txt  d.txt  e.txt  f.txt

我们可以使用lssed + xargs相结合来实现您的目标。

$ ls | sed -e "p;s/\.txt$/\.sql/"|xargs -n2 mv

$ ls
a.sql  b.sql  c.sql  d.sql  e.sql  f.sql

有关详细信息,请参阅http://nixtip.wordpress.com/2010/10/20/using-xargs-to-rename-multiple-files/