gpt4 book ai didi

linux - 巴什 |将文件排序到子目录

转载 作者:太空宇宙 更新时间:2023-11-04 12:19:29 24 4
gpt4 key购买 nike

在我当前的目录中,我有 x 个具有不同时间戳的文件,例如:

    -rw-r--r-- 1 Domain Users    0 Jan  1  2006 file_JAN2006
-rw-r--r-- 1 Domain Users 0 Mar 1 2006 file_MAR2006
-rw-r--r-- 1 Domain Users 0 Jan 1 2011 file_JAN2011
-rw-r--r-- 1 Domain Users 0 Mar 1 2011 file_MAR2011
-rw-r--r-- 1 Domain Users 0 Apr 1 2011 file_APR2011
-rw-r--r-- 1 Domain Users 0 Jun 1 2011 file_JUN2011
-rw-r--r-- 1 Domain Users 0 Nov 1 2015 file_NOV2015
-rw-r--r-- 1 Domain Users 0 Dec 1 2015 file_DEC2015
-rw-r--r-- 1 Domain Users 0 Oct 1 2016 file_OCT2016

我在下面创建了脚本,它将创建多年的 subDir,并且在 yearsDIR 中,需要有月份列表。

mkdir -p {2006..2016}/{Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sept,Oct,Nov,Dec}

2006:
Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sept

2007:
Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sept

2008:
Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sept

2009:
Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sept

2010:
Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sept

2011:
Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sept

2012:
Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sept

2013:
Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sept

2014:
Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sept

2015:
Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sept

2016:
Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sept

如何对从 1 月到 12 月的月份进行排序?并根据年份和日历月份将上面列出的文件分类到子目录中。在此先致谢。

最佳答案

如果我理解你的问题实际上不是“排序”本身,而是“移动”每个文件之一(例如file_JAN2006) 到基于年份和月份的关联目录中(例如 2006/Jan),那么您的问题就没有那么困难了(尤其是使用 bash,因为您已经标记了您的问题)

例如,给定目录中的文件列表:

$ ls -l
total 8
-rw-r--r-- 1 david david 0 Sep 26 14:50 file_APR2011
-rw-r--r-- 1 david david 0 Sep 26 14:50 file_DEC2015
-rw-r--r-- 1 david david 0 Sep 26 14:50 file_JAN2006
-rw-r--r-- 1 david david 0 Sep 26 14:50 file_JAN2011
-rw-r--r-- 1 david david 0 Sep 26 14:50 file_JUN2011
-rw-r--r-- 1 david david 0 Sep 26 14:50 file_MAR2006
-rw-r--r-- 1 david david 0 Sep 26 14:50 file_MAR2011
-rw-r--r-- 1 david david 0 Sep 26 14:50 file_NOV2015
-rw-r--r-- 1 david david 0 Sep 26 14:50 file_OCT2016

您可以使用如下简单的简短脚本将文件移动到您指定的目录结构中:

#!/bin/bash

while read -r fn; do ## loop over each filename
m="${fn:5:3}" ## get month (string indexes)
m="${m,,}" ## convert to lowercase
m="${m^}" ## 1st char to uppercase
y="${fn:8}" ## get year (string indexes)
test -d "$y/$m" || mkdir -p "$y/$m" ## create dir for file
printf "mv %s %s\n" "$fn" "$y/$m" ## print what is being done
mv "$fn" "$y/$m" ## move file into new dir
done

将文件名通过管道传输到脚本或使用进程替换 生成文件名列表会将文件移动到它们的新位置,例如

$ bash ../parse.sh < <(find . -maxdepth 1 -type f -name "file_*" -printf "%f\n")

当然,如果您只是想将命令复制/粘贴到终端中而不使用脚本,您可以替换 while read -r fn;用 for fn i *;做。例如下面的代码做同样的事情:

for fn in file_*; do                    ## loop over each filename
m="${fn:5:3}" ## get month (string indexes)
m="${m,,}" ## convert to lowercase
m="${m^}" ## 1st char to uppercase
y="${fn:8}" ## get year (string indexes)
test -d "$y/$m" || mkdir -p "$y/$m" ## create dir for file
printf "mv %s %s\n" "$fn" "$y/$m" ## print what is being done
mv "$fn" "$y/$m" ## move file into new dir
done

无论哪种方式,生成的文件/目录结构将是:

$ tree
.
├── 2006
│   ├── Jan
│   │   └── file_JAN2006
│   └── Mar
│   └── file_MAR2006
├── 2011
│   ├── Apr
│   │   └── file_APR2011
│   ├── Jan
│   │   └── file_JAN2011
│   ├── Jun
│   │   └── file_JUN2011
│   └── Mar
│   └── file_MAR2011
├── 2015
│   ├── Dec
│   │   └── file_DEC2015
│   └── Nov
│   └── file_NOV2015
└── 2016
└── Oct
└── file_OCT2016

13 directories, 9 files

如果我误解了您的问题,或者您有任何其他问题,请告诉我。

关于linux - 巴什 |将文件排序到子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46431659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com