我有成千上万的照片文件夹。无论出于何种原因,他们在导出时创建了几个这样的场景:
2019/01/01
2019/01/01 #2
如何编写可以自动移动文件的 linux 命令(理想情况下可以在 Mac 上运行)
from
2019/01/01 #2
to
2019/01/01
任何帮助,将不胜感激。这需要适用于任何日期并合并内容。我苦苦挣扎的地方是我无法理解如何在没有 # 的情况下将目录作为原始格式
for dir in *#2/*; do mv "$dir"/* "${dir}"; done
在尝试此操作之前备份您的文件。这可能是破坏性的...
部分问题是
for
在遍历名称中包含一些空格的文件夹时使用。您最终会得到一个不一致的列表,因为空格和回车都是字段分隔符。您只需设置IFS
回车即可。(您可以使用find -exec
直接处理文件系统条目,但是在使用嵌套通配符时会变得混乱)这应该可以完成工作,但要注意移动的文件将覆盖目标文件夹中的匹配文件。从上面的根文件夹运行它。
做了一些假设: - 您描述的结构是年/月/日子文件夹。(如果文件夹名称包含
\
它会变得更丑) - 你只有一些带有#2
后缀的文件夹 - 一旦你将文件移出,你想删除 #2 文件夹。请参阅此处了解如何在 bash 中使用字符串做更多奇怪的事情......
使用
find
和-exec
:如果后一个目录存在,这会将所有文件从 eg 移动
2019/01/01 #2
到2019/01/01
(如果不存在,#
则重命名带有 的文件夹)。如果2019/01/01 #2
其他文件夹中已经存在文件,它会请求移动文件的权限。移动操作完成后,它会尝试删除(现在为空的)文件夹。所有移动/删除操作都处于详细模式。
与 for循环
nullglob
结合使用可确保"$dir"/*
在目录已经为空时不返回任何文件。