我正在使用 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
标志指定目录并给出以下错误:
mv: illegal option --t
usage: mv [-f | -i | -n] [-v] source target
如何在 macOS 中执行此操作?
答案1
如果没有-t
,您必须将目标目录保留为 的最后一个非选项参数mv
。这给了我们两个选择:要么将find
文件名放在 的目标目录之前mv
,要么找到可以执行相同操作的其他内容。所以,要么:
find "$d" -type f -exec mv -i {} "$d" \;
或者:
export d; find "$d" -type f -exec sh -c 'exec mv -i "$@" "$d"' sh {} +
在第一个命令中,mv
针对每个文件执行。在第二个中,sh -c ...
针对一批文件执行,然后又mv
针对整个批次运行。第二个选项可能会快得多,但由于您使用的是交互式确认,所以这并不重要。
答案2
它与 bash 无关。这是mv
命令。
您可以安装 gnumv
来获取该-t
选项。或者查看其他答案,但有一点额外的建议。
手册页显示了这两种模式(我删除了该-t
模式)
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
您可能会注意到,如果您不指定-T
(我认为也仅在 Gnu mv 中),并且有两个参数,则语法是不明确的。通过检查最后一个文件可以解决歧义。如果是目录,则为第二种形式,否则为第一种形式。通过在/
目录名后面加上 ,可以使语法变得明确,从而强制采用第二种形式。这将阻止许多错误。不幸的是,消除第一种形式歧义的唯一方法是使用-T
.