递归解析目录名,如果目录名中找不到则添加字符串

递归解析目录名,如果目录名中找不到则添加字符串

我想像这样解析我的 FLAC 音乐目录:

  • 仅递归检查目录名称
  • 如果目录名不包含字符串“FLAC”或“flac”,则在目录名末尾添加“ [FLAC]”。

这看起来正确地找到了不包含“FLAC”字符串的目录:

find . -type d -not -iname '*flac*'

那么我怎样才能将“ [FLAC]”附加到每个目录名称之后?

答案1

我会尝试这样的事情

find . -depth -mindepth 1 -type d -not -iname '*flac*' -execdir echo mv -n -- '{}' '{} [FLAC]' \;

echo(仅经过彻底测试后才可删除)。

-depth选项指定深度优先搜索,这避免了尝试重命名祖先已被重命名的子项的情况。 阻止-mindepth 1它尝试添加[FLAC]到当前目录,.

替换字符串的准确引用取决于个人喜好 -... {} {}\ \[FLAC\]或者... {} {}' [FLAC]'效果同样好。

请注意,虽然 GNUfind会替换{}所有地方(而不仅仅是单独出现的地方),但其他实现可能不会 - 在这种情况下,你需要执行类似

... -execdir sh -c 'for d; do echo mv -n -- "$d" "$d [FLAC]"; done' find-sh {} + 

答案2

您可以编写一个简单的脚本来处理目录名称,并使用find管道xargs将目录名称提供给脚本。例如:

find . -type d -print0 | \
    xargs -0 $HOME/bin/waltscript

并在 中进行检查和重命名$HOME/bin/waltscript

相关内容