linux – 更好的方式根据多种模式重命名文件

前端之家收集整理的这篇文章主要介绍了linux – 更好的方式根据多种模式重命名文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
很多我下载的文件在他们的文件名中有垃圾邮件/垃圾邮件,例如

[www.crap.com] file.name.ext

www.crap.com – file.name.ext

我想出了两种处理方法,但是他们似乎很笨重:

参数扩展:

  1. if [[ ${base_name} != ${base_name//\[+([^\]])\]} ]]
  2. then
  3. mv -v "${dir_name}/${base_name}" "${dir_name}/${base_name//\[+([^\]])\]}" &&
  4. base_name="${base_name//\[+([^\]])\]}"
  5. fi
  6.  
  7. if [[ ${base_name} != ${base_name//www.*.com - /} ]]
  8. then
  9. mv -v "${dir_name}/${base_name}" "${dir_name}/${base_name//www.*.com - /}" &&
  10. base_name="${base_name//www.*.com - /}"
  11. fi
  12.  
  13. # more of these type of statements; one for each type of frequently-encountered pattern

然后用echo / sed:

  1. tmp=`echo "${base_name}" | sed -e 's/\[[^][]*\]//g' | sed -e 's/\s-\s//g'`
  2. mv "${base_name}" "{tmp}"

我觉得参数扩展是更糟糕的两个,但我喜欢它,因为我可以保留相同的变量分配给文件进行进一步处理后重命名(上述代码用于每个文件的脚本中使用文件下载完成后).

所以无论如何,我希望有一个更好/更干净的方式做上述,比我自己更有知识的人可以告诉我,最好是允许我轻松地将旧/原始变量重新分配到新/重命名文件.

谢谢

解决方法

两个答案:使用 perl重命名或使用纯 bash

因为有些人不喜欢perl,我写了我的bash唯一版本

使用rename命令重命名文件.

介绍

是的,这是重命名命令的典型工作,它是专为以下设计:

  1. man rename | sed -ne '/example/,/^[^ ]/p'
  2. For example,to rename all files matching "*.bak" to strip the
  3. extension,you might say
  4.  
  5. rename 's/\.bak$//' *.bak
  6.  
  7. To translate uppercase names to lower,you'd use
  8.  
  9. rename 'y/A-Z/a-z/' *

更加面向样品

只需放下所有空格和方括号:

  1. rename 's/[ \[\]]*//g;' *.ext

通过编号从1重命名所有.jpg

  1. rename 's/^.*$/sprintf "IMG_%05d.JPG",++$./e' *.jpg

演示:

  1. touch {a..e}.jpg
  2. ls -ltr
  3. total 0
  4. -rw-r--r-- 1 user user 0 sep 6 16:35 e.jpg
  5. -rw-r--r-- 1 user user 0 sep 6 16:35 d.jpg
  6. -rw-r--r-- 1 user user 0 sep 6 16:35 c.jpg
  7. -rw-r--r-- 1 user user 0 sep 6 16:35 b.jpg
  8. -rw-r--r-- 1 user user 0 sep 6 16:35 a.jpg
  9. rename 's/^.*$/sprintf "IMG_%05d.JPG",++$./e' *.jpg
  10. ls -ltr
  11. total 0
  12. -rw-r--r-- 1 user user 0 sep 6 16:35 IMG_00005.JPG
  13. -rw-r--r-- 1 user user 0 sep 6 16:35 IMG_00004.JPG
  14. -rw-r--r-- 1 user user 0 sep 6 16:35 IMG_00003.JPG
  15. -rw-r--r-- 1 user user 0 sep 6 16:35 IMG_00002.JPG
  16. -rw-r--r-- 1 user user 0 sep 6 16:35 IMG_00001.JPG

完整的语法用于匹配SO问题,以安全的方式

使用重命名实用程序有一个强大而安全的方式:

由于这是perl常用工具,我们必须使用perl语法:

  1. rename 'my $o=$_;
  2. s/[ \[\]]+/-/g;
  3. s/-+/-/g;
  4. s/^-//g;
  5. s/-\(\..*\|\)$/$1/g;
  6. s/(.*[^\d])(|-(\d+))(\.[a-z0-9]{2,6})$/
  7. my $i=$3;
  8. $i=0 unless $i;
  9. sprintf("%s-%d%s",$1,$i+1,$4)
  10. /eg while
  11. $o ne $_ &&
  12. -f $_;
  13. ' *

测试规则:

  1. touch '[ www.crap.com ] file.name.ext' 'www.crap.com - file.name.ext'
  2. ls -1
  3. [ www.crap.com ] file.name.ext
  4. www.crap.com - file.name.ext
  5. rename 'my $o=$_; ...
  6. ...
  7. ...' *
  8. ls -1
  9. www.crap.com-file.name-1.ext
  10. www.crap.com-file.name.ext
  11.  
  12. touch '[ www.crap.com ] file.name.ext' 'www.crap.com - file.name.ext'
  13. ls -1
  14. www.crap.com-file.name-1.ext
  15. [ www.crap.com ] file.name.ext
  16. www.crap.com - file.name.ext
  17. www.crap.com-file.name.ext
  18. rename 'my $o=$_; ...
  19. ...
  20. ...' *
  21. ls -1
  22. www.crap.com-file.name-1.ext
  23. www.crap.com-file.name-2.ext
  24. www.crap.com-file.name-3.ext
  25. www.crap.com-file.name.ext

… 等等…

…它是安全的,而你不使用-f标志重命名命令:文件将不会被覆盖,如果出现问题,您将收到一条错误消息.

通过使用bash和所谓的bashisms重命名文件

我更喜欢通过使用专用的实用程序,但这甚至可以通过使用纯bash(也就是没有任何叉子)

没有使用任何其他二进制文件比bash(没有sed,awk,tr或其他):

  1. #!/bin/bash
  2.  
  3. for file;do
  4. newname=${file//[ \]\[]/.}
  5. while [ "$newname" != "${newname#.}" ] ;do
  6. newname=${newname#.}
  7. done
  8. while [ "$newname" != "${newname//[.-][.-]/.}" ] ;do
  9. newname=${newname//[.-][.-]/-};done
  10. if [ "$file" != "$newname" ] ;then
  11. if [ -f $newname ] ;then
  12. ext=${newname##*.}
  13. basename=${newname%.$ext}
  14. partname=${basename%%-[0-9]}
  15. count=${basename#${partname}-}
  16. [ "$partname" = "$count" ] && count=0
  17. while printf -v newname "%s-%d.%s" $partname $[++count] $ext &&
  18. [ -f "$newname" ] ;do
  19. :;done
  20. fi
  21. mv "$file" $newname
  22. fi
  23. done

要以文件作为参数运行,示例:

  1. /path/to/my/script.sh \[*

>用点替换空格和方括号>只用一个 – 替换.-,– .,– 或..的顺序.>测试文件名是否不同,没有任何关系.>测试一个文件是否存在newname …>分割文件名,计数器和扩展名,用于创建索引的新名称>如果一个文件存在newname,则循环> Finaly重命名文件.

猜你在找的Linux相关文章