2012-03-08 105 views
2

我正在寫shell腳本。linux shell獲取文件的名稱

我有以下文件:

2012-03-08_16-37-41 
2012-03-08_16-37-43 
2012-03-08_16-37-46 
2012-03-08_16-37-55 

簡單腳本:

#!/bin/bash 
FILENAME= ???? 
echo $FILENAME 

而且FILENAME值應爲2012-03-08_16-37-55(排序的文件名列表的最後一個元素)。另外,文件名的開頭應該是2012

我該如何解決這個問題?

回答

5
FILENAME=$(ls -r 2012* | head -n 1) 
+0

甚至比我的想法更好:) +1 – 2012-03-08 15:59:25

+0

看起來不錯,但是當2012-03-08_16-37-55是文件夾時,命令返回裏面文件的值。 – Martynas 2012-03-08 16:12:24

+0

sry。它正在工作。但在最後以「:」返回。如何刪除它? – Martynas 2012-03-08 16:15:41

1

您可以使用該ls命令來獲取文件,或只是使用「文件通配符」擴大通配符。

#!/bin/sh 

for filename in 2012*; do 
    echo "File (by globbing) is $filename" 
done 

ls 2012* | while read filename; do 
    echo "File (via ls) is $filename" 
done 

得到最後一個,最簡單的方法可能對ls輸出排序:

filename=`ls -r 2012* | head -1` 

但是,你也可以直接尾巴水珠,如果你想成爲凌亂。

for filename in 2012*; do 
    echo "File (by globbing) is $filename" 
done | tail -1 
0
f=""; 
for f in 2012* ; 
do 
    # haha - don't do anything. 
    dummy=42 
done; 
echo "now do something with $f" 
2

不要parse ls輸出。相反,使用發現:

#!/bin/sh 

find . -name 2012* | sort | tail -1 

將結果賦值給一個變量:下面的符號鏈接

#!/bin/sh 

filename=$(find . -name 2012* | sort | tail -1) 

這也使您可以訪問所有的many options find has,包括(沒有),遞歸,只返回文件(不是目錄),檢查時間戳等等。

0

不使用任何外部命令:set 2012*; eval FILE=\$$#。這是一個完全安全的使用eval