我正在使用ccase。
以下命令有效。
$ mv camelCase (ccase -t Kebab camelCase)
现在我尝试使用以下方法重命名多个目录:
$ find . -type d -execdir rename 's/(.*)/$(ccase -t Kebab $1)/' '{}' \+
这不起作用,我收到此错误消息:
Can't rename ./camelCase3 1000 4 24 27 30 46 121 132 1000ccase -t Kebab ./camelCase3): No such file or directory
我能做些什么?
应该:
切勿将它们嵌入/或任何语言解释器的代码
{}
参数中,这将使其成为命令注入漏洞。请参阅是否可以安全地使用“find -exec sh -c”?sh
bash
其他一些注意事项:
-
,请使用--
来标记选项的结尾。我不知道是否ccase
支持--
,如果不支持,您可以将其作为错误报告给他们的维护人员。bash
,你的系统sh
应该足够了mv
,最好检查您运行的每个命令是否成功。这里我们使用|| continue
跳过失败的目录ccase
。+
下;
传递多个目录sh
,这样可以避免每个文件调用一个 shell。但并非所有find
支持该非标准-execdir
谓词的实现都会这样做。在某些 BSD 或旧版本的 GNU 中find
,+
只是执行相同的操作;
,然后循环是多余的(尽管无害)。mv -- SomeDir some_dir
,如果some_dir
已经存在并且是一个目录或目录的符号链接,则它与 相同mv -- SomeDir some_dir/SomeDir
。通过 GNU 实现mv
,可以使用选项来避免这种-T
情况(或使用zmv
下面的方法来检测冲突)为了避免这种情况
-execdir
并运行尽可能少的 shell,您可以使用-exec
它,但随后您需要将基本名称和父目录分开。作为改进,我们还可以记录 的失败ccase
,mv
以便将其反映在 的find
退出状态中:请注意,上面我添加了一个至少给用户一个选项来避免数据丢失,例如两个文件最终具有相同的新名称时
-i
。mv
更好的方法是使用 zshzmv
,它可以提前检查所有内容并具有试运行模式 (-n
):默认情况下它还会忽略隐藏文件。它默认进行深度优先遍历。相当于.
(#q/)
_-type d
在这种情况下, 的退出状态ccase
将被忽略。当名称未更改时,不会尝试重命名。您可以替换
(*)
为(^*-*)
以避免处理名称中已包含连字符的文件。您也可以在 zsh 中转换为 Kebab 大小写:
我们将所有空格或下划线序列转换为单个
-
,在基本名称中的-
非大写字符(除了.
、 和)和大写字符之间插入 s,并将整个结果转换为小写。如果您想重命名为而不是 ,则需要进行调整。-
l
AFileInTheUK.txt
a-file-in-the-u-k.txt
afile-in-the-uk.txt
逐个重命名目录并从最深的第一个开始。例如
检查后删除单词print以武装脚本,它确实符合您的要求;-)。
在这里。我正在寻找的命令是: