这是根据修改日期创建唯一文件夹的好方法吗?
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 {}
代码说明:
ls -l
#查找文件并告诉我修改日期。
sort -k8n -k6M -k7n
# 按第 8 列(数字格式)然后 6(格式为月份)然后 7(数字格式)对值进行排序。
tr -s ' '
# 将所有 spaces 截断为一个 spaces.
cut -d ' ' -f6-8
# 通过分隔符“”剪切文本(即 space)并保存第 6-8 列。
uniq
#只保存唯一值
sed '/^$/d'
#去掉空行。
parallel -j 24 date --date={} +"%Y-%m-%d"
#将输入和并行处理分成24个作业。然后将日期输入(来自 {})转换为 YYYY-MM-DD 格式。
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 版本或两个)).
我有一个装满图像的文件夹。我想根据修改图像(或文件)的时间为每个创建文件夹。这是在 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 {}
代码说明:
ls -l
#查找文件并告诉我修改日期。sort -k8n -k6M -k7n
# 按第 8 列(数字格式)然后 6(格式为月份)然后 7(数字格式)对值进行排序。tr -s ' '
# 将所有 spaces 截断为一个 spaces.cut -d ' ' -f6-8
# 通过分隔符“”剪切文本(即 space)并保存第 6-8 列。uniq
#只保存唯一值sed '/^$/d'
#去掉空行。parallel -j 24 date --date={} +"%Y-%m-%d"
#将输入和并行处理分成24个作业。然后将日期输入(来自 {})转换为 YYYY-MM-DD 格式。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 版本或两个)).