重命名包含左/右方块的目录

重命名包含左/右方块的目录

要重命名包含左右方块的目录,您可以使用:

shopt -s globstar 
rename -n 's/\(|\[|\]|\)//g' **

这将用 [ & ] 从您所在的目录中递归重命名所有内容。

但我需要将其作为 nemo.action 脚本执行,但无法使其工作。 (基本上是一个普通的bash脚本)

我当前的脚本是:

#!/bin/bash
shopt -s globstar 

rename  "$@" 's/\(|\[|\]|\)//g' **

哪里$@/media/sf_Mediaserver3/Untitled Folder/[ hdjue] [kskk]

哪里的[ hdjue] [kskk] (只是随机字母)是我要重命名的起始文件夹以及以下文件/文件夹...

这当然不起作用,现在我必须转到父目录并运行第一行,但这将处理父目录中的所有目录,不仅有人 [ hdjue] [kskk] 知道如何解决这个问题?

似乎重命名函数无法处理起始目录?

如果可能,请删除所有空格(替换为 .(点)),并使文件名/目录小写,以简化与外部/内部请求的兼容性。

答案1

据我了解,这里的要求是从指定路径及其下的文件和目录中删除[和字符的所有实例。]

困难在于避免在仍在遍历目录时重命名目录。 globstar**从根向下列出项目,而不是深度优先,因此给定一个示例,例如a a/b a/b/c,重命名a将意味着a/b和的路径a/b/c不再有效。该find选项可以用它来处理这个问题-depth,但这需要不同的方法

#!/bin/bash
#
find "$@" -depth -name '*[[\]]*' -print0 |
    while IFS= read -d '' -r item
    do
        path="${item%/*}" file="${item##*/}"    # Separate path and file name parts
        name="${file//[[\]]/}"                  # Generate new file name
        name="${name// /.}"                     # Comment: space becomes dot
        name="${name,,}"                        # Comment: lowercase name

        echo mv -f "$item" "$path/$name"        # Rename
    done

echo当您满意脚本将执行您期望的操作时,删除(或补充)它。

-print0我结合使用了-d ''选项来read处理具有非常奇怪的文件名的文件(包括带有换行符和非打印字符的文件)。如果您想查看正在发生的情况,或者您的实现不支持它们,则可以删除两者,但脚本会变得不那么健壮

使用 glob(不是正则表达式)分配变量 、 和 matchpathfile的修饰符。name单个修饰符 ( %, #, /) 表示最短或单个匹配;双修饰符 ( %%, ##, //) 表示最长匹配或多个匹配。这一切都记录在bash手册页中,但这是我的解释和上下文:

  • ${item%/*}表明%最短与 glob 模式的匹配应该从结尾的值$item。所以我们会删除a/b/c匹配的文本/*a/b
  • ${item##*/}表明##最长与 glob 模式的匹配应该从开始的值$item。所以我们会删除a/b/c匹配的文本*/c
  • ${file//[[\]]/}表明//多种的glob 的替换内容应替换为下一个后面的文本/,即什么也不替换。 glob 是方括号中两个字符[和的集合],意思是“或者[]。所以ab[cd]ef[gh我们最终会得到abcdefgh

相关内容