我在名为:
的目录中有很多文件str1 - str2.txt
如何在bash中将它们重命名为:
str2 - str1.txt
str1
- 是一个包含字母数字字符,空格的字符串,在某些情况下还包含一个或多个-
个字符。str2
- 是一个只包含字母数字字符的字符串。我可以使用rename 'y/str1 - str2/str2 - str1/' *
命令逐个重命名它们,但我想找到一个合适的正则表达式来同时重命名所有文件。
答案 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
$
当然,您需要根据自己的需求调整一下,但mmv
,mcp
,......真的非常强大
答案 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