我正在使用 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
Run Code Online (Sandbox Code Playgroud)
macOS 中的命令mv
不允许-t
标志指定目录并给出以下错误:
mv: illegal option --t
usage: mv [-f | -i | -n] [-v] source target
Run Code Online (Sandbox Code Playgroud)
如何在 macOS 中执行此操作?
如果没有-t
,您必须将目标目录保留为 的最后一个非选项参数mv
。这给了我们两个选择:要么将find
文件名放在 的目标目录之前mv
,要么找到可以执行相同操作的其他内容。所以,要么:
find "$d" -type f -exec mv -i {} "$d" \;
Run Code Online (Sandbox Code Playgroud)
或者:
export d; find "$d" -type f -exec sh -c 'exec mv -i "$@" "$d"' sh {} +
Run Code Online (Sandbox Code Playgroud)
在第一个命令中,mv
针对每个文件执行。在第二个中,sh -c ...
针对一批文件执行,然后又mv
针对整个批次运行。第二个选项可能会快得多,但由于您使用的是交互式确认,所以这并不重要。