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