我在/ media / user / docs下有一个文件夹集合(> = 50),其命名约定如下:
[2001] xxx 1
[2002] yyy
zzz
我想编写一个bash脚本,将这些文件夹重命名为以下格式:
xxx 1 (2001)
yyy (2002)
zzz
如何使用重命名或任何其他Linux命令来实现?我的工作环境是Ubuntu 14.04。谢谢。
答案 0 :(得分:3)
鉴于包含此内容的文件:
$ cat a
[2001] xxx
[2002] yyy
zzz
这可以通过使用后退引用(以及转义[
和]
)来取代您想要的方式:
$ 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 words
答案 1 :(得分:1)
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
为每个以[
开头的文件切换列。
希望这有帮助
如果是文件,而不是文件夹:
如果你有超过1个空格和扩展名:
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
答案 2 :(得分:1)
使用mmv
package。
mmv -r '\[*\]\ *' '#2 (#1)'
由于您需要转义方括号,这有点复杂,这里是short explanation。
请注意,重命名目录需要-r
。
ls -1 ./
[2001] xxx
[2002] yyy
zzz
ls -1 ./
xxx (2001)
yyy (2002)
zzz
答案 3 :(得分:0)
这可以使用或不使用文件扩展名:
#!/bin/bash
[[ BASH_VERSINFO -ge 4 ]] || exit 1 ## Let's make minimum Bash version to 4.0.
shopt -s nullglob
for F in "$PREFIX"*; do
read A B <<< "${F##*/}"
[[ $A == \[*\] && -n $B && -d $F ]] || continue
A=${A:1:${#A} - 2}
X=''
if [[ $B =~ (.[^. ]+)+$ ]]; then
X=$BASH_REMATCH
B=${B:0:${#B} - ${#X}}
fi
echo mv -- "$F" "${PREFIX}${B} ($A)$X"
done
干运后删除echo
。
这是测试的结果:
mv -- /var/tmp/test/[2001] A /var/tmp/test/A (2001)
mv -- /var/tmp/test/[2001] B.txt /var/tmp/test/B (2001).txt
mv -- /var/tmp/test/[2001] C.txt.gz /var/tmp/test/C (2001).txt.gz
-d $F
确保只处理目录。如果您想要定位文件,请更改为-f $F
,如果需要,则只需删除表达式。