macOS/bash 相当于 mv -t

she*_*th7 5 osx mv

我正在使用 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 中执行此操作?

mur*_*uru 4

如果没有-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针对整个批次运行。第二个选项可能会快得多,但由于您使用的是交互式确认,所以这并不重要。