簡體   English   中英

重擊 將文件排序到子目錄

[英]BASH | sort files to sub directories

在我當前的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多年,並且在這些YearDIR內需要包含月份列表。

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

如何分類從一月到十二月的幾個月? 並根據年份和日歷月份將上面列出的文件分類到子目錄中。

如果我理解您的問題不是本質上實際上是“排序”本身,而是根據年份和月份(例如2006/Jan每個文件(例如file_JAN2006“移動”到關聯目錄之一,那么您的問題是並不是那么困難(尤其是使用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替換while read -r fn; do while read -r fn; dofor fn i *; 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

如果我誤解了您的問題,或者您還有其他問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM