要重命名包含左右方块的目录,您可以使用:
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(不是正则表达式)分配变量 、 和 matchpath
时file
的修饰符。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