我将嵌套文件夹/图片文件的目录展平为一个文件夹。我想将所有嵌套文件移动到根级别。
有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
即可覆盖。在上面的例子中,没有提示。它只是覆盖。
答案 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或,[]应该做什么?
我在平板电脑上,不能轻易包含来源。