我有一个目录,里面全是我翻录成 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
先运行。