这是根据修改日期创建唯一文件夹的好方法吗?

Is this a good way to create unique folders based on modified dates?

我有一个装满图像的文件夹。我想根据修改图像(或文件)的时间为每个创建文件夹。这是在 bash 中执行此操作的好方法吗?该代码有效,但我仍然是新手,不确定是否有更好的方法。

ls -l | sort -k8n -k6M -k7n | tr -s ' ' | cut -d ' ' -f6-8 | uniq | sed '/^$/d'| parallel -j 24 date --date={} +"%Y-%m-%d"| parallel -j 24 mkdir {}

代码说明:

  1. ls -l #查找文件并告诉我修改日期。
  2. sort -k8n -k6M -k7n # 按第 8 列(数字格式)然后 6(格式为月份)然后 7(数字格式)对值进行排序。
  3. tr -s ' ' # 将所有 spaces 截断为一个 spaces.
  4. cut -d ' ' -f6-8 # 通过分隔符“”剪切文本(即 space)并保存第 6-8 列。
  5. uniq #只保存唯一值
  6. sed '/^$/d' #去掉空行。
  7. parallel -j 24 date --date={} +"%Y-%m-%d" #将输入和并行处理分成24个作业。然后将日期输入(来自 {})转换为 YYYY-MM-DD 格式。
  8. parallel -j 24 mkdir {} #create 24 个作业,这些作业根据先前命令 ({}) 的输出创建文件夹。

有很多更简单、不易出错的方法可以做到这一点。如果你有 date(1) 的 GNU 版本,例如:

#!/usr/bin/env bash
shopt -s nullglob
declare -A mtimes
# Adjust pattern as needed
for file in *.{png,jpg}; do
    mtimes[$(date -r "$file" +'%Y-%m-%d')]=1
done
mkdir "${!mtimes[@]}"

这使用一个 bash 关联数组来存储所有用于创建新目录的时间戳,然后使用单个 mkdir.

一次性创建它们

并且由于我在评论中提到更喜欢用纯 shell 以外的方式来做,tcl 一行:

tclsh8.6 <<'EOF'
file mkdir {*}[lsort -unique [lmap file [glob -nocomplain -type f *.{png,jpg}] { clock format [file mtime $file] -format %Y-%m-%d }]]
EOF

perl:

perl -MPOSIX=strftime -e '$mtimes{strftime q/%Y-%m-%d/, localtime((stat)[9])} = 1 for (glob q/*.{png,jpg}/); mkdir for keys %mtimes'

这两个的优点是不需要 date 的特定实现(-r 选项不是 POSIX;不确定它在外部的支持程度GNU coreutils 版本),或 bash 4+(如果你使用的是 Mac 的问题(我 认为 它们仍然带有 perl , 至少到下一个 OS X 版本或两个)).