首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mv命令(在Mac上)覆盖文件,即使使用-i?

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

Stack Overflow用户
提问于 2015-06-20 20:49:00
回答 2查看 1.1K关注 0票数 0

我正在将嵌套文件夹/图片文件的目录压缩到一个文件夹中。我希望将所有嵌套文件移到根级别。

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

代码语言:javascript
运行
复制
find ./ | wc -l
find ./ -type d | wc -l

为了使平面化,我使用以下命令:

代码语言:javascript
运行
复制
find ./ -mindepth 2 -exec mv -i -v '{}' . \;

问题是,当我在运行flatten命令后得到一个计数时,我的计数将被关闭46。在查看了之前和之后的文件列表(我有一个备份)之后,我发现mv命令有时会覆盖文件,尽管我使用的是-i

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

代码语言:javascript
运行
复制
.//Vacation/CIMG1075.JPG -> ./CIMG1075.JPG
..more log
..more log
..more log
.//dog pics/CIMG1075.JPG -> ./CIMG1075.JPG

所以我看得出来这是在覆盖。我以为-i应该阻止这一切的。我还试了一次-n,得到了相同的号码。注意,我确实有大约150个重复的文件名。在我把我能做的东西都压平后,就会手动重命名。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-20 22:40:28

显然,人工录入明确指出:

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

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

代码语言:javascript
运行
复制
[ -f "${1##*/}" ]

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

代码语言:javascript
运行
复制
[ -f "${1##*/}" ] || mv "$1" .

使用它,您可以编辑find命令如下:

代码语言:javascript
运行
复制
find ./ -mindepth 2 -exec bash -c '[ -f "${0##*/}" ] || mv "$0" .' '{}' \;

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

票数 2
EN

Stack Overflow用户

发布于 2015-06-20 22:56:20

为什么不检查文件是否存在,先移动?然后你可以把文件留在原处,或者你可以重命名它或者做其他事情.

测试-f,还是,[]应该这样做?

我在平板电脑上,不能轻松地包括来源。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30958743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档