我正在编写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
。
我怎么能解决这个问题?
答案 0 :(得分:5)
FILENAME=$(ls -r 2012* | head -n 1)
答案 1 :(得分:2)
不要parse ls输出。相反,请使用find:
#!/bin/sh
find . -name 2012* | sort | tail -1
将结果分配给变量:
#!/bin/sh
filename=$(find . -name 2012* | sort | tail -1)
这也使您可以访问所有many options find has,包括(不)以下符号链接,递归,仅返回文件(不是目录),检查时间戳等。
答案 2 :(得分: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
答案 3 :(得分:0)
f="";
for f in 2012* ;
do
# haha - don't do anything.
dummy=42
done;
echo "now do something with $f"
答案 4 :(得分:0)
不使用任何外部命令:set 2012*; eval FILE=\$$#
。这是eval
的完全安全使用。