0

我在一个名为的目录中有很多文件:

str1 - str2.txt

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

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

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

4

3 回答 3

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
于 2013-09-21T14:07:51.107 回答
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
$

当然,您需要根据自己的需要对其进行一些调整,但是mmv,,mcp...确实很强大

于 2013-09-21T18:05:20.373 回答
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
于 2013-09-21T14:02:04.683 回答