我在/media/user/docs下面有一个文件夹(>=50)集合,具有以下命名约定:
[2001] xxx 1
[2002] yyy
zzz我想编写一个bash脚本,将这些文件夹重命名为以下格式:
xxx 1 (2001)
yyy (2002)
zzz如何通过使用重命名或任何其他Linux命令来实现?我的工作环境是Ubuntu14.04。谢谢。
发布于 2014-08-14 13:32:05
使用mv:
$ ls -d [*
[2001] yyy 2 [2002] xxx 1做:
for i in [*; do
new=$(echo $i | tr "[|]" "(|)" | awk '{for (i=2;i<=NF;i++) printf $i" "; print $1}');
mv "$i" "$new";
done
$ ls -d *\)
xxx 1 (2002) yyy 2 (2001)它将[]由()替换为tr,然后为每个以[开头的文件切换使用awk的列。
希望这能有所帮助
如果是文件,而不是文件夹:
如果你有超过一个空格和分机:
for i in [*.ext; do
new=$(echo ${i%.*} | tr "[|]" "(|)" | awk '{for (i=2;i<=NF;i++) printf $i" "; print $1}');
mv "$i" "$new.ext";
done它将将文件名[2002] yyy 1.ext转换为yyy 1 (2002).ext。
发布于 2014-08-14 13:25:17
给定一个具有此内容的文件:
$ cat a
[2001] xxx
[2002] yyy
zzz这可以通过使用back引用(并转义[和])来代替您想要的方式:
$ sed 's/\[\([0-9]*\)\] \(\w*\)$/\2 (\1)/' a
xxx (2001)
yyy (2002)
zzz这样您就可以完全以相同的方式使用rename:
rename 's/\[\([0-9]*\)\] \(\w*\)$/\2 (\1)/' *
^^^^^^^^^^ ^^^^^^^ ^^^^^^^
| | print them back
catch numbers catch wordshttps://stackoverflow.com/questions/25309049
复制相似问题