到目前为止,我找到了一个解决方案,可以大量更改所有这些烦人的文件名,使它们可读且更易于在命令行中操作。
于是我在众多命令中发现了一个小软件,叫做排毒。默认情况下,它会用 替换空格_
。阅读手册页并没有给我答案如何使 detox 重命名文件并用 替换空格-
。
[/] cd test
one five/ one four/ one one/ one three/ one two/
[test] detox *
[test] l
one_five/ one_four/ one_one/ one_three/ one_two/
[test]
怎么做?
我找不到.detoxrc
文件(或与该程序相关的任何文件),如果我创建它,我不知道要在其中放入什么。
PS 除了排毒之外还有其他方法吗?
答案1
至少从 detox 版本 1.2.0 开始,可以自定义过滤(根据您的发行版,可能需要更改以下命令/位置)。首先:
cp /usr/share/detox/safe.tbl ~/mysafe.tbl
接下来编辑文件mysafe.tbl
,搜索单词“space”(第 127 行左右)并将下划线更改为连字符。
现在修改~/.detoxrc
eg如下:
sequence hyphenated {
safe {filename "/home/MY_USSERNAME/mysafe.tbl";};
#wipeup {remove_trailing;};
};
(当然替换“MY_USERNAME”...)
现在运行以下命令:
detox -vs hyphenated *
你应该可以走了:)
编辑20170801:Detox 似乎存在一些 UTF-8 问题。已经创建了一些补丁,通过电子邮件发送给上游和 debian maints,现在必须在某个名为“github”或其他网站上打开一个错误 - 是时候弄清楚了......
答案2
排毒似乎没有这个选择。修改源代码以添加具有所需输出的过滤器应该相当简单(对safe
过滤器进行小修改;不要忘记确保-
删除任何前导)。
您可以对 的结果进行后处理detox
,或者完全使用其他工具。有许多更灵活的文件重命名工具。
这Perl重命名命令(不要与 util-linux 命令混淆rename
)支持使用任意 Perl 代码转换文件名。该命令可用作rename
此命令在 Debian 及其衍生版本(Ubuntu、Mint 等)上。它在 Arch 上可用:Perl 重命名。如果您只想更改_
为-
并删除前导-
,您可以使用:
rename 's/_/-/g; s/\A-*//' *
这只影响当前目录中的文件(点文件除外)。要递归地作用于目录,请将其与find
命令结合起来。
find . -depth -exec rename 's/_/-/g; s/\A-*//' {} +
Detox 的其他功能可以用 Perl 来表达,其中大部分都用s/PATTERN/REPLACEMENT/
操作员。例如,要仅保留字母和数字并用 替换任何其他字符序列-
,您可以使用
rename 's/[^[:alnum:]]+/-/g; s/\A-//' …
如果你想用 ASCII 近似 Unicode 字符, 您可以使用文本::Unicode:
perl -C -MText::Unidecode /usr/bin/rename '$_ = unidecode($_)' …
另一个强大的重命名工具是兹马夫命令来自桀骜壳。首先运行它(将其放入您的~/.zshrc
交互式使用中):
autoload -U zmv
要更改_
为-
并去除前导-
,您可以使用:
zmv '**/*' '$f:h/${${f##*/-#}//_/-}'
该模式**/*
使该命令递归地作用于当前目录的子目录。