在我目前的DIR中,我有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月的月份进行排序?并根据年份和日历月将上面列出的文件排序到子目录中。谢谢。
答案 0 :(得分:0)
如果我理解你的问题实际上不是“排序”本身,而是其中一个“移动”每个文件(例如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; do
替换为for fn i *; do
。例如,以下内容做同样的事情:
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
如果我误解了您的问题,或者您有任何其他问题,请告诉我。