需要从文件中删除撇号。我尝试了几种方法,也来自Stackexchange。
我在 Synology NAS 上,所以我没有 Python 或 Perl,而且我必须排除某些目录(查找 -prune)。
以下 find 命令似乎在测试期间通常有效(使用 echo):
find . -depth \( -type d -name "@*" -o -name "*#recycle*" -o -name "*SynoResource*" -prune \) -o \( -name "*\'*" -execdir bash -c 'for f; do echo mv ${f/\\\'/\\\\'} `echo $f | sed 's/\\\'/X/g'`; done' _ {} + \)
对于像“911's.zip”这样的文件,将撇号 ' 替换为 X 会生成以下结果(使用上面的命令):
mv ./911's.zip ./911Xs.zip
当我删除“echo”以执行命令时,出现以下错误:
mv: target '911Xs.zip' is not a directory
在交互式 shell 中,我可以使用以下命令重命名文件:
mv 911\'s.zip 911Xs.zip
当然,我曾试图逃避 ' (即使有几个 \,如 in ${f/\'/X}
),但它不起作用。
任何想法?
非常感谢,
加里
几个问题:
-prune
与进程组合首先离开,因此-depth
在处理完目录的全部内容之后,它来得太晚没有效果。-depth
-prune
-prune
的放错地方了。你把它放在哪里,它只适用于匹配的文件-name "*SynoResource*"
。仅-type d
适用于-name "@*"
.echo
一般不能用于输出任意数据。'
内部单引号字符串。如果您需要将 a'
字面意思传递给某个命令,则需要使用另一个 shell 引用运算符("..."
或反斜杠)在单引号之外对其进行引用。'
对他们来说不是特别的mv
,sed
也find
没有必要为他们逃避它。它仅对作为强引用运算符的 shell 来说是特殊的。$(...)
而不是弃用的`...`
(当涉及反斜杠时,这也会增加更多的复杂性)。所以在这里:
在这里,由于
-prune
不能与 一起使用-depth
,我们使用-path
(-wholename
在 GNU中也称为find
)根据完整路径过滤掉那些排除目录中的文件。但是,这意味着find
从性能的角度来看,这将下降到那些不理想的目录中。使用意味着您只重命名了很好的基本名称,但这也意味着您最终会在每个包含带有s 的文件的目录中
-execdir
运行至少一个。或者,您可以这样做:bash
'
在脚本运行时有人重命名文件和目录时,这使得它更有效,但安全性更低。
对于试运行,您可以将
mv
命令替换为:这比使用
echo
asbash
在跟踪输出中必要时使用引号要好,以使其明确。跟踪输出看起来好像是可用于运行相同命令的有效 shell 代码。在那里,使用
-exec
而不是-execdir
使跟踪清楚哪些文件将被重命名。要使用
-prune
但仍然首先处理目录深度,另一种方法是在输出上使用 GNUtac -s ''
(如果可用)(连同 GNUxargs
)find -print0
来反转它:如果没有 GNU
tac
,xargs
但如果你的 bash 是 4.4 或更高版本,你也可以这样做:(请注意我没有测试过任何这些)。