如何在bash脚本中重命名文件

时间:2014-08-14 13:20:04

标签: bash rename mv

我在/ media / user / docs下有一个文件夹集合(> = 50),其命名约定如下:

[2001] xxx 1
[2002] yyy
zzz

我想编写一个bash脚本,将这些文件夹重命名为以下格式:

xxx 1 (2001)
yyy (2002)
zzz

如何使用重命名或任何其他Linux命令来实现?我的工作环境是Ubuntu 14.04。谢谢。

4 个答案:

答案 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,如果需要,则只需删除表达式。