我需要編寫一個腳本,該腳本將根據上次修改日期執行目錄中的一些可執行檔。最年長的應該先跑。我該怎麼做?
這就是我到目前為止所做的
for f in ./jobqueue/*; #accessing the queue
do
chmod +x * # giving executable permission for the files
$f # running the executables
done
答案1
預設情況下,Shell 通配符會依詞法順序展開。如果您需要不同的排序順序,則需要一個支援指定順序的 shell,zsh
這可能是一件好事,因為您已經zsh
在那裡使用語法(透過不引用$f
)。
for f in ./jobqueue/*(.NOm); do
chmod +x $f
$f
done
這(.NOm)
部分是zsh
的通配限定符。.
僅適用於常規文件,N
如果沒有匹配的文件,則展開為空,而不是報告錯誤(就像nullglob
啟用了該選項一樣),在修改時Om
轉換為order(大寫表示相反順序) 。m
對於 GNU shell ( bash
) 和 GNU ls
,等價物是:
eval "files=($(ls -drt --quoting-style=shell ./jobqueue/* 2> /dev/null))"
for f in "${files[@]}"
[ -f "$f" ] && [ ! -L "$f" ] || continue
chmod +x -- "$f"
"$f"
done
答案2
如果您的檔案名稱不包含空格或製表符或換行符號或或?
或*
且[
該目錄不包含子目錄,您可以嘗試類似的方法
for f in $(ls -tr ./jobqueue/) ; do
chmod +x ./jobqueue/$f
./jobqueue/$f
done