2016-09-27 64 views
0

我有下面的bash搜索特定目錄並返回該目錄中最早的文件夾。 bash如果它們在每個文件夾中都沒有子文件夾,則效果很好。如果有返回而不是主文件夾。我不知道爲什麼會發生這種情況,或者如何解決這個問題。謝謝 :)。搜索返回子文件夾不在主打折扣文件夾

例如,

/home/cmccabe/Desktop/NGS/test是目錄中搜索,並在其中有兩個文件夾,R_1 and R_2

輸出

The earliest folder is: R_1 

但是,如果/家庭/ cmccabe /桌面/ NGS/test has R_1及其內部的測試文件夾and R_2及其中的testfolder2`

輸出

The earliest folder is: testfolder 

猛砸

cd /home/cmccabe/Desktop/NGS/test 
folder=$(ls -u *"R_"* | head -n 1) # earliest folder 
echo "The earliest folder is: $folder" 

回答

1

ls是這個工作的錯誤工具:它的輸出是爲人類而不是腳本構建的,而且當不可打印的字符出現時通常是令人驚訝的。


假設你有GNU findsort,與所有可能的文件名以下工作,包括那些文字換行:

dir=/home/cmccabe/Desktop/NGS/test # for my testing, it's "." 
{ 
    read -r -d $'\t' time && read -r -d '' filename 
} < <(find "$dir" -maxdepth 1 -mindepth 1 -printf '%T+\t%P\0' | sort -z -r) 

...之後:

echo "The oldest file is $filename, with an mtime of $time" 

有關可移植地查找最新或最舊文件的更多討論在一個目錄中,包括不需要需要GNU工具的選項,請參閱BashFAQ #99

+0

非常感謝您的幫助和解釋:)。 – Chris

1

你應該閱讀有關LS,-u選項並沒有做什麼,你認爲它。以下是相關選項:

  • -u - 指示ls在按時間排序時使用上次訪問時間,而不是上次修改時間。先按時間(修改或訪問或者別的什麼),與最新的第一
  • -r - - 因此,它本身什麼都不做,應該-t
  • -t被稱爲反轉輸出的順序
  • -d - 不要搜索目錄遞歸

所以你實際上需要的是:

$ ls -trd 

或者:

$ ls -utrd