用sh

2012-09-27 19 views
0

可能重複清單文件:
Get the newest file based on timestamp用sh

我主要想選擇特定文件夾中最新的轉儲文件,這樣我就可以在可變的存儲和使用它導入使用導入腳本

我想列出特定的文件,我試過了:

a= $(ls -ltr /home/oracle/testora/MAUL01*.dmp | awk '{print $9}' | tail -1) 
echo $a 

我想輸出爲:代替

MAUL01.DP.09-27-2012_09_15.dmp 

/home/oracle/testora/MAUL01.DP.09-27-2012_09_15.dmp 

問題: LS是不是爲我工作裏面SH(從UNIX工作的罰款) 文件名顯示與路徑(我使用基本名稱,但不能使它的工作)

+0

爲什麼basename不起作用? – turtledove

+0

你需要這個sh,而不是bash? –

回答

2

在bash中,你可以使用${parameter##word}語法最後/之前刪除一切。您可以使用ls -tr1,那麼您將不需要0​​。

這是如下圖所示:

a=$(ls -tr1 /home/oracle/testora/MAUL01*.dmp | tail -1) 
echo ${a##*/} 
+0

這仍然是邪惡的。請參閱http://mywiki.wooledge.org/ParsingLs –

0

在這裏,我們去(不需要basename那裏):

cd /home/oracle/testora 
latest="$(ls -t MAUL01*.dmp | sed q)" 
echo "The latest one is $latest $USER" 

,並發現:

cd /home/oracle/testora 
latest="$(
    find -maxdepth 1 -name 'MAUL01*.dmp' -printf '%As %f\n' | 
    sort -nk1 | 
    tail -1 
)" 
+0

儘管如此,'sed q'是編寫'head -n 1'的一個非常模糊的方法。 – tripleee

+0

是的,但非常有趣,更短=) –

+0

即使在查找版本(查找需要與-print0一起使用以安全地區分其輸出中合法UNIX文件名的全部範圍),也不會正確處理帶有換行符的文件名。 –

0

試試這個:

a=$(ls -ltr /home/oracle/testora/MAUL01*.dmp | awk '{print $9}' | tail -1) 
echo $(basename $a) 
1

你的代碼不能正常工作;在a=之後有一個空格。 basename容易修復此:

name="$(basename /home/oracle/testora/MAUL01*.dmp)" # Assumes only one glob match 
echo "$name" 

此外,Use More Quotes™don't parse ls output。如果問題是整理文件,檢查this solution

IFS= read -r -d '' -u 9 9< <(find /home/oracle/testora/ -maxdepth 1 -name 'MAUL01*.dmp' -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) 
path="${REPLY#* }" 
echo "$(basename "$path")" 

是的,在處理猛砸名是毛。

+0

我會使用另一個參數擴展來剝離基本名稱 - 調用子shell(以運行basename命令)並且讀取其輸出效率不足。否則,這可能是這裏最好的答案。 –

+0

也許如果你正在處理數千個文件。 '爲我在$(seq 1 1000); do foo = $(basename $ PWD);完成'在我的舊版Mac Mini上花費大約1秒鐘。在這種情況下,我們正在討論一個'basename'調用,所以這是過早的優化(更不用說以'/'結尾的路徑減少爲空字符串的常見錯誤)。 – l0b0

+0

...雖然我是nitpicky(呃,這是我們在Freenode #bash頻道常客) - seq是Linux的唯一的東西;考慮使用C風格的循環。 (for((i = 1; i <1000; i ++));做...'。至於性能方面 - 當然,在現代硬件上並不重要,但人們也會爲路由器和其他嵌入式系統編寫腳本。 –

0

通過參數擴展輕鬆(和安全地)完成;不需要任何ls(這在操作系統之間是危險的並且行爲不同)或者找到(除非與-print0和一些技巧一起使用來處理NUL分隔的流,否則這也是危險的)。這是POSIX sh的兼容版本:

set -- /home/oracle/testora/MAUL01*.dmp 
for filename; do 
    echo "${filename##*/}" 
done 

如果你正在使用bash,而不是,您可以將您的水珠在一個陣列輸出,因而不會覆蓋[email protected]:如果你想

shopt -s nullglob 
filenames=(/home/oracle/testora/MAUL01*.dmp) 
for filename in "${filenames[@]}"; do 
    echo "${filename##*/}" 
done 

僅針對最新文件進行過濾,請參閱http://mywiki.wooledge.org/BashFAQ/003