2012-03-08 69 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