mv Bash Shell Command(在Mac上)甚至用-i覆盖文件?

时间:2015-06-20 20:49:00

标签: macos bash shell

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

有3,381个文件(计数中不包含任何目录)。我使用这两个命令计算这个数字并减去目录数(第二个命令):

find ./ | wc -l
find ./ -type d | wc -l

要展平,我使用此命令:

find ./ -mindepth 2 -exec mv -i -v '{}' . \;

问题是当我在运行flatten命令后得到一个计数时,我的计数结束了46。在浏览了之前和之后的文件列表(我有一个备份)后,我发现mv命令正在覆盖文件有时,即使我正在使用-i

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

.//Vacation/CIMG1075.JPG -> ./CIMG1075.JPG
..more log
..more log
..more log
.//dog pics/CIMG1075.JPG -> ./CIMG1075.JPG

所以我可以看到它被覆盖了。我以为-i应该阻止这个。我也尝试了一个-n并得到了相同的数字。请注意,我确实有大约150个重复的文件名。在我把所有可能的东西弄平了之后,我会手动重命名。

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

注意:它提示我某些文件被覆盖。在这些提示中,我只需按Enter即可覆盖。在上面的例子中,没有提示。它只是覆盖。

2 个答案:

答案 0 :(得分:2)

显然manual entry明确指出:

  

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

换句话说,您应该自己模仿-n选项。为此,只需检查文件是否存在并采取相应措施。在shell脚本中,文件作为第一个参数提供,可以按如下方式完成:

[ -f "${1##*/}" ]

该文件作为第一个参数,包含可以使用##*/去除的目录。现在只需使用mv执行||,因为我们希望在文件不存在时执行。

[ -f "${1##*/}" ] || mv "$1" .

使用此功能,您可以按如下方式编辑find命令:

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

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

答案 1 :(得分:1)

为什么不先检查文件是否存在?然后你可以将文件保留在原来的位置,或者你可以重命名它或做其他的事情......

测试-f或,[]应该做什么?

我在平板电脑上,不能轻易包含来源。