【问题标题】:blindly rename files - linux [closed]盲目重命名文件 - linux [关闭]
【发布时间】:2012-07-20 11:17:27
【问题描述】:

我有相当多的文件具有长文件名、符号、空格等。我想随机和盲目地一次重命名所有文件,同时给它们一个来自1-9a-Z 的随机文件名。我不想操纵每个文件名,因为有时它会由于符号、空格、长度等而抛出错误。

非常感谢任何形式的帮助。提前谢谢你。

【问题讨论】:

    标签: linux bash rename


    【解决方案1】:

    您可以使用 inodenumber 作为文件名。保证在文件系统中是唯一的。

    #!/bin/sh
                                            # inodenumber+name
    find . -name \*tmp -type f -ls | awk '{print $1," ",$11}' | (
            while read i p; do
            # UPDATE: extract the basename and suffix
            b=`basename $p`
            s="${b##*\.}"
            echo "b=$b"
            echo "s=$s"
    
            # remove the echo after testing ...
            echo mv -i $p $i.$s
            done
            )
    #eof
    

    注意:如果文件名中有空格或制表符,这将不起作用。

    【讨论】:

    • 是的,这最终对我有用,但是,如何通过重命名所有内容并仍然保留文件扩展名来实现这一点?
    • suffix="${p##*\.}" 可以解决问题。可能您应该首先从 p 获取基本名称。
    • @thevoipman - 究竟什么才是“扩展”?如果我有backupfile.20120720.tar.gz,你是在第一个点还是在最后一个点分开?没有“通用”解决方案适用于所有情况。每个解决方案都是专门构建的。
    • @ghoti 这是真的。就我而言,我想暂时取最后一个点。
    • @wildplasser 感谢您的提示,您能告诉我应该如何/在哪里放置那条线吗?
    【解决方案2】:

    带有临时文件名的 Oneliner(更改您自己的目录):

    for f in *; do mv "$f" `mktemp -p /home/user/temp`; done
    

    【讨论】:

    • +1。你可能想先生成新的文件名,看看它是否已经存在while true; do new=$(mktemp); [[ -e "$new" ]] || break; done; mv "$f" "$new"
    • 您好,我已经尝试了您的建议,但它给了我错误: 用法:mktemp [-V] | [-dqtu] [-p 前缀] [模板] mv:201207217MsrpnCsa9n6Vht.mp3' Try mv --help' 之后缺少目标文件操作数以获取更多信息。 mktemp: 无效选项 -- -
    • 好的,我已将 --tmpdir 选项更改为 -p。立即尝试并给我反馈。
    • @glennjackman AFAIK,mktemp 对于不存在的文件名是安全的。
    • @igustin 我已经测试过了,但现在它提示我进行覆盖,而我什至还没有运行这个命令,但建议使用它——另外,我们如何保持文件扩展名完好无损?
    【解决方案3】:

    也许是一个简单的 bash 脚本,就像 Oli 建议的那样:

    #!/bin/bash
    counter=1
    for i in *; do
       mv "$i" "$counter";
       ((counter++))
    done
    

    HTH

    【讨论】:

    • 让 bash 算算:((counter++))
    • 但诀窍是按照他的要求随机进行。在构建涉及对某些文件进行分类的家庭作业问题时,我使用了建议的 awk 脚本。重命名必须是随机的,否则您可以从名称列表中的顺序推断出类。
    • @peterkarasev:请参阅下面 Oli 回答下的 OP 评论。 random 这个词可以有几种不同的方式,具有不同的复杂程度。但是,如果您确实想创建一个“随机”字符串,请使用/dev/urandom。可能类似于:< /dev/urandom tr -dc '[0-9A-Za-z]' | head -c 8; echo。 HTH
    • 甜蜜!比尝试使用 date +%N 好得多
    【解决方案4】:
    1. 创建一个临时目录
    2. 对于每个文件,mv filename tmp/$i,其中$i 是一个递增的数字。
    3. mv tmp/* ..

    【讨论】:

    • 你好,如何将 $i 设为递增数字?
    猜你喜欢
    • 2016-05-06
    • 2014-09-14
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2020-12-21
    • 2018-05-01
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多