【问题标题】:Recursively prepend text to file names递归地将文本添加到文件名
【发布时间】:2014-05-09 13:09:43
【问题描述】:

我想在位于当前目录或子目录中的特定类型的每个文件(在本例中为 .txt 文件)的名称前添加文本。

我试过了:

find -L . -type f -name "*.txt" -exec mv "{}" "PrependedTextHere{}" \;

问题在于处理 {} 引用附带的路径的 ./ 部分。

感谢任何帮助或替代方法。

【问题讨论】:

    标签: linux bash rename


    【解决方案1】:

    你可以这样做

    find -L . -type f -name "*.txt" -exec bash -c 'echo "$0" "${0%/*}/PrependedTextHere${0##*/}"' {} \;
    

    在哪里

    • bash -c '...' 执行命令
    • $0 是传入的第一个参数,在本例中为 {} -- 完整文件名
    • ${0%/*} 删除文件名中最后一个 / 和之后的所有内容
    • ${0##*/} 删除文件名中最后一个 / 之前的所有内容

    如果您对它的工作感到满意,请将 替换为

    【讨论】:

    • 这就是我要找的!一个问题:行尾的{} 到底在做什么?
    • @user3477312 它只是一个符号,find 命令使用它作为当前正在处理的文件名的占位符。将它放在 exec 的末尾只是将它作为参数传递给正在执行的命令。
    【解决方案2】:

    您只是想将文件移动到一个新的文件名,该文件名之前有 Prepend

    for F in *.txt; do mv "$F" Prepend"$F"; done
    

    或者您是否希望它处理子目录并在目录和文件名之间添加前缀:

    dir1/PrependA.txt
    dir2/PrependB.txt
    

    【讨论】:

    • 我想处理所有子目录中的此类文件。
    • 我明白了。我会建议类似@BroSlow 的解决方案,但可能使用basenamedirname 来获取文件夹和文件。
    【解决方案3】:

    这里是一个快速的镜头。如果有帮助,请告诉我。

    for file in $(find -L . -type f -name "*.txt")
    do
    parent=$(echo $file | sed "s=\(.*/\).*=\1=")
    name=$(echo $file | sed "s=.*/\(.*\)=\1=")
    mv "$file" "${parent}PrependedTextHere${name}"
    done
    

    【讨论】:

    • 您在发帖前尝试过运行此程序吗?发生了什么?
    • 感谢@Johnsyweb。我一开始是不正确的。我已经编辑过,相信应该会更好。
    • 你几乎不应该在 bash 中使用 for something in $(command)。有太多的分词问题会导致语法失败(例如包含空格的文件)。见this。使用while/read 循环或他们拥有的管道示例之一进行流程替换会更好。
    • 你说得对,这不适用于名称或路径中包含空格的文件,也许放在这里的小免责声明...
    • bash 中的内部字段分隔符 (IFS) 通常设置为 $'\t\n '(空格),这意味着 bash 将假定空格分隔标记,因此它将带有空格的文件名拆分为单独的标记循环而不是一个文件名。
    【解决方案4】:

    这应该可以工作,因为长文件名没有换行符。在这种情况下,使 find 使用 -print0 和 IFS 为空。

    #!/bin/sh
    IFS='
    '
    for I in $(find -L . -name '*.txt' -print); do
        echo mv "$I" "${I%/*}/prepend-${I##*/}"
    done
    

    附言删除 echo 以使脚本生效,它可以避免那些随机将粘贴内容从这里复制到他们的 shell 的人意外损坏。

    【讨论】:

      猜你喜欢
      • 2010-11-09
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 2011-08-23
      • 2013-06-03
      • 1970-01-01
      相关资源
      最近更新 更多