我正在使用 macOS 并尝试在 Bash 中执行以下命令:
cd root || exit
shopt -s dotglob
for d in ./*
do
if [ -d "$d" ]
then
find "$d" -type f -exec mv -i -t "$d" {} +
find "$d" -mindepth 1 -type d -delete
fi
done
macOS 中的mv
命令不允许-t
flag 指定目录并给出以下错误:
mv: illegal option --t
usage: mv [-f | -i | -n] [-v] source target
如何在 macOS 中执行此操作?
如果没有
-t
,您必须将目标目录保留为 . 的最后一个非选项参数mv
。这给了我们两个选择:要么find
将文件名放在目标目录之前mv
,要么找到其他可以做同样事情的东西。所以,要么:或者:
在第一个命令中,
mv
对每个文件执行。在第二个中,sh -c ...
对一批文件执行,然后mv
对整个批次运行。第二个选项可能更快,但由于您使用的是交互式确认,所以它并不重要。它与 bash 无关。这是
mv
命令。您可以安装 gnu
mv
以获取该-t
选项。或者查看其他答案,但有这个额外的建议。手册页显示了这两种模式(我删除了该
-t
模式)您可能会注意到,如果您没有指定
-T
(我也认为,仅在 Gnu mv 中),并且有两个参数,那么语法是模棱两可的。通过检查最后一个文件来解决歧义。如果它是一个目录,那么它是第二种形式,否则它是第一种形式。语法可以通过在目录名称后面加上一个来明确/
,从而强制使用第二种形式。这将阻止许多错误。不幸的是,消除第一种形式歧义的唯一方法是使用-T
.