【问题标题】:How to incorporate conditions in a for loop to create folder names based on file dates如何在 for 循环中合并条件以根据文件日期创建文件夹名称
【发布时间】:2019-12-29 22:04:23
【问题描述】:

我设法创建了一个脚本,该脚本循环遍历文件夹中的每个文件,提取年、月和日,然后为此创建文件夹结构。

对于一组文件,我最终会得到这样的文件夹:

2019
  02 (February)
    01 (Day 1)
  03
    01
    02

问题:如何合并现有文件夹的比较并阻止脚本一遍又一遍地执行相同的操作?即,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

【问题讨论】:

  • 使用mkdir -p,如果目录已经存在则不会产生错误。换句话说,如果任何目录已经存在,调用mkdir -p "$YEAR/$MONTH/$DAYOFMONTH" 并没有什么坏处。 mkdir 只会创建路径中需要的部分。
  • 太棒了!谢谢你。比我尝试做的要容易得多。

标签: bash directory


【解决方案1】:

只需将-p 选项传递给mkdir 即可在目录已存在时消除错误。

或者在创建之前检查目录是否已经存在,例如:

if [ ! -d "$dir" ]; then
      mkdir "$dir"
fi

注意事项:

  • 为避免错误,例如处理带有空格的文件名,请引用变量扩展名。
  • 您不需要迭代年、月、日,没有什么可迭代的。一个文件有一个修改时间,一年、一个月、一个月中的一天,而不是每个文件的多个修改时间。没有要迭代的内容,您正在迭代一个元素。
  • 请注意,您的循环for file in * 也将遍历目录,而不仅仅是遍历文件。因此,在您第一次运行脚本之后,当您下次运行它时,它将遍历创建的年份目录。
  • 为了便于携带,我建议将date -r 替换为stat -c + date -ddate -r 可能无法在任何地方使用。

只是:

for file in *; do
   dest="$(date -r "$file" +"%Y/%m/%d")"
   mkdir -p "$dest"
   cp "$file" "$dest"
done

【讨论】:

  • 我实际上发现使用 cp 在保存文件创建/修改日期方面对我没有任何好处,所以我使用 rsync -a 而不是 cp。
猜你喜欢
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多