Bash

切換到目前目錄最後修改的子目錄

  • October 4, 2016

我有一個應用程序,它定期在不同的目錄中生成幾個文件,我需要檢查生成的最新文件,即在最近的目錄中生成的文件(創建或更新)。該文件的名稱在所有目錄中保持相同,所以我只想要一個簡單的腳本,它將目錄更改為最後修改的子目錄。

$$ Update $$通過看到大多數答案,我想我應該澄清目錄名稱是動態的(取決於一些使用者輸入和時間戳),所以我不能假設像 dir 這樣的目錄模式$$ 1, 2, 3 $$或類似的

根據您想要做什麼以及文件的結構,其他可能性可能是可用的,例如:

ls -1tq /dir/*/readme.txt | head -n 1

返回在 /dir/ 的任何子目錄(非遞歸)中找到的最新 readme.txt 的全名

  • 作為路徑的一部分(不僅僅是文件名的一部分)的用法通常是不為人知的,我認為值得一提。
file=$( ls -1tq /dir/*/readme.txt | head -n 1 )
cd $( dirname "$file" )

為此,您不需要任何復雜的管道。此外,你不需要find任何東西——你已經知道每個文件在哪裡,你只是不知道其中哪個是最新的。這很容易處理。

為了展示,這是我的小測試:

mkdir ./dir1 ./dir2 ./dir3

for d in 1 2 3
do  touch ./dir$d/samefile
   sleep 1
done

這將創建測試集。現在,哪個是最新的?

set -- ./dir[123]/samefile
while [ -e "$2" ]
do  [ "$1" -nt "$2" ] && 
   set -- "$@" "$1"
shift; done
printf %s\\n "$@"

那會告訴我的。

輸出

./dir3/samefile

而且我可以隨意切換操作的順序touch——它會給我正確的資訊。你所需要的只是函式中的那個小小的 shell 循環,如下所示:

newd() { ${2:+:} return 1
   while [ -e "$2" ] && [ -e "$1" ]
   do  [ "$1" -nt "$2" ] && 
       set -- "$@" "$1"
   shift; done
   ${2+false} cd "${1%/*}"
}

請注意,這與展示有點不同,因此如果參數少於兩個或任何參數不是實際路徑名,它將可靠地失敗。

現在你可以這樣稱呼它:

newd ./path/to/file1 ./path/to/file2

…等等 - 使用盡可能多的參數。

或者,在我的測試案例中:

newd ./dir[123]/samefile ; pwd

輸出

/home/mikeserv/test/dir3

引用自:https://unix.stackexchange.com/questions/147154