macOS/bash 相当于 mv -t

macOS/bash 相当于 mv -t

我正在使用 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.

相关内容