基于其他目录的输入 mkdir

基于其他目录的输入 mkdir

我有一个目录,里面全是我翻录成 FLAC 格式的专辑。文件夹名为“艺术家 - 专辑 [flac]” 我需要创建名为“艺术家 - 专辑 [mp3]”的匹配目录,但仅限于某些文件夹...

所以“ls | grep Pantera”给了我我想要使用的目录列表......

我如何通过命令行执行此操作?

答案1

您可以使用 xargs 将一个命令的输出用作运行另一个命令的参数;但是,ls由于空格和引用问题,使用 的输出是非常有问题的。为了完成您的建议,如果生成的名称中有任何空格,您将必须执行以下操作:

ls | grep Pantera | sed -e 's/\[flac\]/[mp3]/' | xargs -n1 -i{} mkdir "{}"

然而好多了为此,工具是使用find命令和-exec选项。除非有人知道如何在文字字符串上使用 bash 的字符串函数而不是变量,或者在一个命令中设置并使用变量,否则您将需要ssapkota 的语法启动子外壳。

使用 find 时,还要考虑一些选项,例如-type d仅返回目录匹配项(或-type f文件)。-maxdepth 1如果您想进行递归查找,可以删除。模式匹配也有可能针对您的场景进行细化。

答案2

Find 是最好的工具。但find只允许单个命令,不支持链接。

下面是通过为每个匹配的目录名称分叉一个子 shell 来工作的解决方案。

find -maxdepth 1 -iname "*Pantera*" -exec  \
    bash -c ' name="{}" && mkdir "${name/flac/mp3}" ' \;

答案3

所有文件都在同一目录中吗?然后您可以使用简单的循环加上 shell 字符串操作结构。

for flac_dir in *Pantera*'[flac]'/; do
  flac_dir=${flac_dir%/}
  mp3_dir="${x%\[flac\]}[mp3]"
  mkdir "$mp3_dir"
done

如果您也想在子目录中、在 zsh 下或在 bash ≥4 下递归操作,您可以使用for flac_dir in **/*Pantera*'[flac]'/.使用 bash,您需要shopt -s globstar先运行。

相关内容