【问题标题】:Mass rename in linuxlinux中的批量重命名
【发布时间】:2015-12-13 02:17:11
【问题描述】:

你能告诉如何使用重命名来重命名所有文件,留下前8个字符和扩展名,例如:

我有:

001 -superfile-blaha_bla.txt

我需要:

001 -supe.txt

【问题讨论】:

    标签: regex linux sed rename


    【解决方案1】:
    rename 's/^(.{8}).*/$1/' *
    

    会将文件截断为 8 个字符或更少。如果截断导致两个或多个文件映射到相同的名称,rename 默认会发出警告并拒绝覆盖除名称冲突中涉及的一个文件之外的所有文件。

    如果你使用

    rename --force 's/^(.{8}).*/$1/' *
    

    然后rename 将覆盖文件。

    【讨论】:

    • 抱歉,我的重命名工具没有选项 --force $ rename --version rename from util-linux 2.27
    • 据此util-linux rename man page,“重命名没有保障。”所以它出现在 util-linux 中,我为 --force 描述的行为是 util-linux 的 rename 的默认行为。
    • [int13h@homepc test]$ ls -1 111asdfasdfMjflksdf.txt asdfasdfMjflksdf.txt fsdafs111asdfasdfMjflksdf.txt gggfsdafs111asdfasdfMjflksdf.txt Myjakfjkldjflksdf.txt homepc test]$ rename 's/^(.{8}).*/$1/' * [int13h@homepc test]$ ls -1 111asdfasdfMjflksdf.txt asdfasdfMjflksdf.txt fsdafs111asdfasdfMjflksdf.txt gggfsdafs111asdfasdfMjflksdf.txt Myjakfjkrrrrrrrrrrrr.txt [int13h@homepc 测试]$
    • rename 's/^(.{8}).*/$1/' * 不要在我的发行版中工作
    【解决方案2】:
    IFS=$'\n'
    files=`ls -1 $1`
    for x in $files
    do
        filename="$x"
        if [ $filename = `basename $0` ] # do not include this script file
            then
            echo "skipping script file"
            continue 
        fi
        suffix=${filename: -4}
        name=${filename:0:8}
        echo "renaming $x to $name$suffix" 
        mv $1/"$x" $1/$name$suffix
    done    
    

    用法:脚本目录名

    注意事项:
    将覆盖重复项,短于 8 个字符的文件名最终会带有部分双后缀,即 ab.dat 最终会成为 ab.dat.dat

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-16
      • 2021-06-17
      • 2016-04-09
      • 2015-08-15
      • 2018-11-10
      • 1970-01-01
      • 2011-04-17
      • 2014-09-10
      相关资源
      最近更新 更多