bash - 如何在 for 循环中合并条件以根据文件日期创建文件夹名称
问题描述
我设法创建了一个脚本,该脚本循环遍历文件夹中的每个文件,提取年、月和日,然后为此创建一个文件夹结构。
对于一组文件,我最终得到如下文件夹:
2019
02 (February)
01 (Day 1)
03
01
02
问题:如何合并与现有文件夹的比较并阻止脚本一遍又一遍地执行相同的操作?IE、MKDIR 2019、MKDIR 2019 等
如果在 2019 年创建了 10 个文件,那么脚本会在第一个循环中创建文件夹,然后接下来的 9 次迭代会报告错误,因为该文件夹已经存在,尽管它仍然给出了所需的结果。
同样的情况发生在月份文件夹和日期文件夹中。
这是我目前拥有的:
#!/bin/bash
for file in *
do
YEAR=$(date -r ${file} +"%Y")
MONTH=$(date -r ${file} +"%m")
DAYOFMONTH=$(date -r ${file} +"%d")
for year in $YEAR
do
mkdir $YEAR
for month in $MONTH
do
mkdir $YEAR/$MONTH
done
for day in $DAYOFMONTH
do
mkdir $YEAR/$MONTH/$DAYOFMONTH
done
done
cp ${file} $YEAR/$MONTH/$DAYOFMONTH
done
解决方案
当目录已经存在时,只需传递-p
选项即可删除错误。mkdir
或者在创建目录之前检查目录是否已经存在,例如:
if [ ! -d "$dir" ]; then
mkdir "$dir"
fi
笔记:
- 为了避免错误,例如处理带有空格的文件名,请引用您的变量扩展。
- 你不需要迭代年、月、日,没有什么可以迭代的。一个文件有一个修改时间,一年,一个月,一个月的一天,而不是每个文件的多个修改时间。没有什么可以迭代,你正在迭代一个元素。
- 请注意,您的循环
for file in *
也将遍历目录,而不仅仅是文件。因此,在您第一次运行脚本之后,当您下次运行它时,它将遍历创建的年份目录。 - 我可以建议
date -r
用stat -c
+替换以date -d
实现可移植性。date -r
可能无法在任何地方工作。
只是:
for file in *; do
dest="$(date -r "$file" +"%Y/%m/%d")"
mkdir -p "$dest"
cp "$file" "$dest"
done
推荐阅读
- java - 在 Reactor 中做异步副作用的最佳方法是什么?
- windows - Fluentbit 创建 TCP 连接
- r - ggfortify 无法加载 - U_FILE_ACCESS_ERROR
- vb.net - VB。NET 印刷标签
- java - 我试图在我的 xhtml 页面中调用我的 JSF 组件,但它无法识别它显示为文本?
- sql - 按条件分组的 ROW_NUMBER()
- kubernetes - 全新安装 okd 后,无法部署容器给出错误文件不存在 memory.limit_in_bytes
- c# - 整套单元测试用例通过但如果我单独运行它会失败
- .net - Axios GET 请求耗时过长
- python - 将数据集写入 Json 文件时,仅打印数据集获取的最后一个值