Macos mvbashshell命令(在Mac上)覆盖文件,即使使用-i?

Macos mvbashshell命令(在Mac上)覆盖文件,即使使用-i?,macos,bash,shell,Macos,Bash,Shell,我正在将嵌套文件夹/图片文件的目录展平为单个文件夹。我想将所有嵌套文件上移到根级别 共有3381个文件(计数中不包括目录)。我使用这两个命令计算这个数字,并减去目录计数(第二个命令): 要展平,我使用以下命令: find ./ -mindepth 2 -exec mv -i -v '{}' . \; 问题是,当我在运行“展平”命令后得到一个计数时,我的计数被关闭了46。在查看了前后文件列表(我有一个备份)后,我发现mv命令有时会覆盖文件,即使我使用的是-I 下面是日志中被覆盖的其中一个文件的详

我正在将嵌套文件夹/图片文件的目录展平为单个文件夹。我想将所有嵌套文件上移到根级别

共有3381个文件(计数中不包括目录)。我使用这两个命令计算这个数字,并减去目录计数(第二个命令):

要展平,我使用以下命令:

find ./ -mindepth 2 -exec mv -i -v '{}' . \;
问题是,当我在运行“展平”命令后得到一个计数时,我的计数被关闭了46。在查看了前后文件列表(我有一个备份)后,我发现
mv
命令有时会覆盖文件,即使我使用的是
-I

下面是日志中被覆盖的其中一个文件的详细信息

.//Vacation/CIMG1075.JPG -> ./CIMG1075.JPG
..more log
..more log
..more log
.//dog pics/CIMG1075.JPG -> ./CIMG1075.JPG
所以我可以看到它被覆盖了。我以为我应该阻止这一切。我还试了一个
-n
,得到了相同的号码。注意,我有大约150个重复的文件名。在我把所有能做的事情都弄平之后,我打算手动重命名

这是时间问题吗? 有办法解决吗

注意:它提示我某些文件被覆盖。在这些提示下,我只需按Enter键,以免覆盖。在上述情况下,没有提示。它只是覆盖了内容。

显然,文件明确指出:

-n和-v选项是非标准的,不建议在脚本中使用它们

换句话说,您应该自己模拟
-n
选项。要做到这一点,只需检查文件是否存在,并采取相应的行动。在作为第一个参数提供文件的shell脚本中,可以按如下方式执行:

[ -f "${1##*/}" ]
find ./ -mindepth 2 -exec bash -c '[ -f "${0##*/}" ] || mv "$0" .' '{}' \;
作为第一个参数,该文件包含可以使用
##*/
剥离的目录。现在只需使用
|
执行
mv
,因为我们希望在文件不存在时执行

[ -f "${1##*/}" ] || mv "$1" .
使用此选项,您可以按如下方式编辑
find
命令:

[ -f "${1##*/}" ]
find ./ -mindepth 2 -exec bash -c '[ -f "${0##*/}" ] || mv "$0" .' '{}' \;
注意,我们现在使用
$0
,这是因为使用了
bash-c
。它的第一个参数,
$0
,不能作为脚本名称,因为我们没有脚本。这意味着参数顺序相对于通常的shell脚本发生了变化。

显然,该脚本明确指出:

-n和-v选项是非标准的,不建议在脚本中使用它们

换句话说,您应该自己模拟
-n
选项。要做到这一点,只需检查文件是否存在,并采取相应的行动。在作为第一个参数提供文件的shell脚本中,可以按如下方式执行:

[ -f "${1##*/}" ]
find ./ -mindepth 2 -exec bash -c '[ -f "${0##*/}" ] || mv "$0" .' '{}' \;
作为第一个参数,该文件包含可以使用
##*/
剥离的目录。现在只需使用
|
执行
mv
,因为我们希望在文件不存在时执行

[ -f "${1##*/}" ] || mv "$1" .
使用此选项,您可以按如下方式编辑
find
命令:

[ -f "${1##*/}" ]
find ./ -mindepth 2 -exec bash -c '[ -f "${0##*/}" ] || mv "$0" .' '{}' \;
注意,我们现在使用
$0
,这是因为使用了
bash-c
。它的第一个参数,
$0
,不能作为脚本名称,因为我们没有脚本。这意味着参数顺序相对于通常的shell脚本发生了变化。

显然,该脚本明确指出:

-n和-v选项是非标准的,不建议在脚本中使用它们

换句话说,您应该自己模拟
-n
选项。要做到这一点,只需检查文件是否存在,并采取相应的行动。在作为第一个参数提供文件的shell脚本中,可以按如下方式执行:

[ -f "${1##*/}" ]
find ./ -mindepth 2 -exec bash -c '[ -f "${0##*/}" ] || mv "$0" .' '{}' \;
作为第一个参数,该文件包含可以使用
##*/
剥离的目录。现在只需使用
|
执行
mv
,因为我们希望在文件不存在时执行

[ -f "${1##*/}" ] || mv "$1" .
使用此选项,您可以按如下方式编辑
find
命令:

[ -f "${1##*/}" ]
find ./ -mindepth 2 -exec bash -c '[ -f "${0##*/}" ] || mv "$0" .' '{}' \;
注意,我们现在使用
$0
,这是因为使用了
bash-c
。它的第一个参数,
$0
,不能作为脚本名称,因为我们没有脚本。这意味着参数顺序相对于通常的shell脚本发生了变化。

显然,该脚本明确指出:

-n和-v选项是非标准的,不建议在脚本中使用它们

换句话说,您应该自己模拟
-n
选项。要做到这一点,只需检查文件是否存在,并采取相应的行动。在作为第一个参数提供文件的shell脚本中,可以按如下方式执行:

[ -f "${1##*/}" ]
find ./ -mindepth 2 -exec bash -c '[ -f "${0##*/}" ] || mv "$0" .' '{}' \;
作为第一个参数,该文件包含可以使用
##*/
剥离的目录。现在只需使用
|
执行
mv
,因为我们希望在文件不存在时执行

[ -f "${1##*/}" ] || mv "$1" .
使用此选项,您可以按如下方式编辑
find
命令:

[ -f "${1##*/}" ]
find ./ -mindepth 2 -exec bash -c '[ -f "${0##*/}" ] || mv "$0" .' '{}' \;

注意,我们现在使用
$0
,这是因为使用了
bash-c
。它的第一个参数,
$0
,不能作为脚本名称,因为我们没有脚本。这意味着参数顺序相对于通常的shell脚本进行了移动。

为什么不在移动之前检查文件是否存在?然后你可以把文件留在原来的地方,或者你可以重命名它,或者做一些其他的事情

测试-f或,[]应该执行此操作吗


我在平板电脑上,无法轻松包含源文件。

为什么不在移动前检查文件是否存在?然后你可以把文件留在原来的地方,或者你可以重命名它,或者做一些其他的事情

测试-f或,[]应该执行此操作吗


我在平板电脑上,无法轻松包含源文件。

为什么不在移动前检查文件是否存在?然后你可以把文件留在原来的地方,或者你可以重命名它,或者做一些其他的事情

测试-f或,[]应该执行此操作吗


我在平板电脑上,无法轻松包含源文件。

为什么不在移动前检查文件是否存在?然后你可以把文件留在原来的地方,或者你可以重命名它,或者做一些其他的事情

测试-f或,[]应该执行此操作吗


我在平板电脑上,无法轻松地包含源代码。

您使用的是什么版本的OS X?