2017-07-18 70 views
0

我有一個包含日期標記的子目錄的目錄。每個子目錄包含按小時用於迭代文件和目錄的shell腳本

parent_dir\ 
--2017-07-12\ 
    -2017-07-12-00 
    -2017-07-12-01 
    -2017-07-12-02 
    -2017-07-12-03 
    ... 
    -2017-07-12-23 
--2017-07-13\ 
    -2017-07-13-00 
    -2017-07-13-01 
    -2017-07-13-02 
    -2017-07-13-03 
    ... 
    -2017-07-13-23 
--2017-07-14 
... 

我要尋找從最近的文件,以最少的啓動特定字符串標記文件。

我嘗試了以下片段遍歷目錄:

MAIN_DIR="/<main_dir_location>" 
for directory in `$MAIN_DIR/* | sort -r`; do 
    echo "$directory" 
done 

MAIN_DIR="/<main_dir_location>" 
for directory in $("$MAIN_DIR"/* | sort -r); do 
    echo "$directory" 
done 

我得到

/<main_dir_location>/2017-07-12: is a directory 

對我來說,它看起來像貝殼試圖錯誤執行從每個循環獲得的目錄值。

  • 這種理解是否正確?
  • 我該如何解決這個問題?
  • 有沒有更好的方法來完成我在這裏要做的事情?
+0

我相信你缺少'ls'命令,試試這個:'$(ls「$ MAIN_DIR」/ * |排序-r)'。 – Azize

+0

你見過['find'](https://linux.die.net/man/1/find)命令嗎?這幾乎可以肯定你想要的。 – dimo414

+0

也許一個好的解決方案是'grep'遞歸併按文件名排序。 – Azize

回答

1

你要做

for directory in $(ls -d "$MAIN_DIR" | sort -r); do 

你的命令試圖使用目錄名作爲命令。

ls -d列出$MAIN_DIR下的所有目錄,並將它們傳遞給sort -r

你可以只使用查找和modiefied(或類似)按日期的答案排序:

find $MAIN_DIR -type d -maxdepth 1 -printf "%T+\t%p\n" | sort 

-type d只有目錄

-maxdepth 1深入

一個文件夾,如果你願意,你可以用正則表達式和更復雜的操作,如「比文件更新」連濾..

對於查找選項,發現printf的選項只是諮詢find's manpage

+0

在當前目錄中以反向排序順序迭代文件的最簡潔方法是什麼? – user1925405

+0

嘗試使用類型f查找,並將其傳遞給正確的排序參數。如果您找到了一種使用find查找文件的方法,甚至可以使用'-exec'參數對這些文件執行操作。有關迭代文件夾的示例,請參閱我的編輯。 –

1

"$MAIN_DIR"/* 將展開(除非目錄爲空)爲目錄列表。您將此擴展放置在需要命令的位置,這會導致將第一個擴展項目作爲可執行文件進行嘗試。

如果前綴

printf '%s\n' #prints each argument on a line 

擴展腳本就可以了(只要你沒有空格/在文件名的通配符):

MAIN_DIR="/<main_dir_location>" 
for directory in $(prinf '%s\n' "$MAIN_DIR"/* | sort -r); do 
    echo "$directory" 
done 

如果你想消除與globbing字符和大部分空白的問題(換行符仍然是否定的),你可以這樣做:

printf '%s\n' "$MAIN_DIR"/* | sort -r | while read -r directory; do 
    #... 
done