我正在将嵌套文件夹/图片文件的目录压缩到一个文件夹中。我希望将所有嵌套文件移到根级别。
有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
键,以避免覆盖。在上述情况下,没有提示。它只是覆盖了。
发布于 2015-06-20 22:40:28
显然,人工录入明确指出:
-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脚本被转移。
发布于 2015-06-20 22:56:20
为什么不检查文件是否存在,先移动?然后你可以把文件留在原处,或者你可以重命名它或者做其他事情.
测试-f,还是,[]应该这样做?
我在平板电脑上,不能轻松地包括来源。
https://stackoverflow.com/questions/30958743
复制相似问题