将多个“str1 - str2.txt”文件重命名为“str2 - str1.txt”

时间:2013-09-21 13:42:24

标签: regex bash unix command-line

我在名为:

的目录中有很多文件
str1 - str2.txt

如何在bash中将它们重命名为:

str2 - str1.txt
  • str1 - 是一个包含字母数字字符,空格的字符串,在某些情况下还包含一个或多个-个字符。
  • str2 - 是一个只包含字母数字字符的字符串。

我可以使用rename 'y/str1 - str2/str2 - str1/' *命令逐个重命名它们,但我想找到一个合适的正则表达式来同时重命名所有文件。

3 个答案:

答案 0 :(得分:3)

试试这个。我使用sed生成要运行的命令列表。您可以将其捕获到文件中并执行该文件。

ls | sed 's/\(.*\) - \([A-Za-z0-9_]*\)\.txt/mv "\1 - \2.txt" "\2 - \1.txt"/g' \
   | grep "^mv" > mv_commands
## Verify that the correct mv commands were generated in the "mv_commands" file
sh commands

答案 1 :(得分:2)

名为mmv的令人敬畏的工具可以做这样的事情

$ touch "str1 - str2.txt"
$ mmv -v "str* - str*.txt" "str#2 - str#1.txt"
str1 - str2.txt -> str2 - str1.txt : done
$ ls -l
total 0
-rw-r--r--  1 hashier  wheel  0 Sep 21 20:05 str2 - str1.txt
$

当然,您需要根据自己的需求调整一下,但mmvmcp,......真的非常强大

答案 2 :(得分:1)

使用脚本重命名当前目录中的所有文件,

list=`ls *-*.txt`

for files in $list
do
  mv $files `echo "$files" | awk -F '.' '{print $1}' | gawk '{match($0, /([^-]*)
  (-+)(.*)/, a); print a[3],a[2],a[1]".txt"}' | tr -d [:space:]`
done