我在一个名为的目录中有很多文件:
str1 - str2.txt
如何在 bash 中将它们重命名为:
str2 - str1.txt
str1
- 是一个包含字母数字字符、空格以及在某些情况下一个或多个-
字符的字符串。str2
- 是一个只包含字母数字字符的字符串。
我可以使用命令一一重命名它们rename 'y/str1 - str2/str2 - str1/' *
,但我想找到一个合适的正则表达式来同时重命名所有文件。
我在一个名为的目录中有很多文件:
str1 - str2.txt
如何在 bash 中将它们重命名为:
str2 - str1.txt
str1
- 是一个包含字母数字字符、空格以及在某些情况下一个或多个-
字符的字符串。str2
- 是一个只包含字母数字字符的字符串。我可以使用命令一一重命名它们rename 'y/str1 - str2/str2 - str1/' *
,但我想找到一个合适的正则表达式来同时重命名所有文件。
尝试这个。我正在使用 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
很棒的工具叫做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
...确实很强大
要使用脚本重命名当前目录中的所有文件,
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