2014-11-24 74 views
0

我正在嘗試編寫一個腳本,該腳本將顯示該腳本執行目錄中最早的文件的名稱。Bash腳本來查找並顯示最舊的文件

這是我到目前爲止有:

#!/bin/bash 
for arg in $* 
do 
oldest=$1 
if [[ $arg -ot $oldest ]] 
then 
    oldest=$arg 
fi 
done 

echo "Oldest file: $oldest" 

我不知道如何以遞增到下一個文件來檢查它是否是舊的

例如:

oldest=$2 
oldest=$3 
etc.. 

試圖在給定以下參數的bash shell中運行此腳本:

myScript `ls -a` 

我得到的結果是:

Oldest File: . 
+0

'在$ * ARG'是越野車 - 與包含空格或引用通配符來看看爲什麼參數嘗試。 '對於「$ @」'中的arg或者'對於arg'(默認行爲是對''@ @「''進行迭代)是正確的選擇。當然,所有這些都假設你正在迭代命令行參數,而不是文件。 – 2014-11-24 03:08:17

+0

...對文件進行迭代,它在*中用於arg,或許在循環內部帶有一個'[-d「$ arg」] && continue'來跳過目錄。 – 2014-11-24 03:10:35

回答

1

您可以使用此功能找到最舊的文件/目錄中的任何目錄:

oldest() { 
    oldf= 
    for f in *; do 
     # not a file, ignore 
     [[ ! -f "$f" ]] && continue 
     # find oldest entry 
     [[ -z "$oldf" ]] && oldf="$f" || [[ "$f" -ot "$oldf" ]] && oldf="$f" 
    done 
    printf '%s\n' "$oldf" 
} 

,並調用它的任何目錄:

oldest 
6

ls程序有一個按時間排序的選項,您可以從該輸出抓取最後一個文件::

# These are both "wun", not "ell". 
#    v   v 
oldest="$(ls -1t | tail -1)" 

如果你想避免的目錄,你可以事先帶他們出去:

# This one's an "ell", this is still a "wun". 
       v       v 
oldest="$(ls -lt | grep -v '^d' | tail -1 | awk '{print $NF}')" 

我一般不會主張解析ls輸出,但它的優良的快速和骯髒的工作,如果你瞭解它的限制。


如果你想有一個腳本,甚至會連續工作誰堅持把控制字符在它們的文件名:-)然後this page有一些更好的選擇,包括瘋子:

unset -v oldest 
for file in "$dir"/*; do 
    [[ -z $oldest || $file -ot $oldest ]] && oldest=$file 
done 

雖然我」 d建議下面的鏈接瞭解爲什麼ls解析一般被認爲是一個壞主意(因此爲什麼它可以在有限的情況下有用,例如當你可以保證所有的文件都是例如3210品種)。那裏有一些有用的信息。

+2

請參閱http://mywiki.wooledge.org/ParsingLs,瞭解爲什麼這是一個糟糕的主意,而http://mywiki.wooledge.org/BashFAQ/003是最佳實踐替代方案。 – 2014-11-24 03:07:01

+0

Thx,@Charles在其上添加了該鏈接和一個選項,這似乎滿足了這裏的特定要求。 – paxdiablo 2014-11-24 03:22:34

0

您可以使用find命令: find -type f -printf '%T+ %p\n' | sort | head -1

+1

修改爲'{IFS = read -r -d''time; IFS =讀取-r -d''名稱; } <<(find -type f -printf'%T +%p \ 0'| sort -z)'你可以使用所有可能的文件名,包括帶有換行符的文件名(你當前的代碼無法處理)。當然,需要GNU排序,但是因爲您已經依賴於GNU擴展找到... – 2014-11-24 04:07:58