linux shell获取文件名

linux shell获取文件名,linux,bash,shell,Linux,Bash,Shell,我正在写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 如何解决此问题?您可以使用ls命令获取文件,也可以使用“文件全局绑定

我正在写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


如何解决此问题?

您可以使用
ls
命令获取文件,也可以使用“文件全局绑定”扩展通配符

FILENAME=$(ls -r 2012* | head -n 1)
#!/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
不要输出。相反,请使用查找:

#!/bin/sh

find . -name 2012* | sort | tail -1
要将结果指定给变量,请执行以下操作:

#!/bin/sh

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

这还允许您访问所有,包括(非)以下符号链接、递归、仅返回文件(非目录)、检查时间戳等。无需使用任何外部命令:
set 2012*;eval FILE=\$$\35;
。这是一个非常安全的使用
eval

的方法,甚至比我的想法更好:)+1看起来很好,但是当2012-03-08_16-37-55是文件夹时,命令返回inside file.sry的值。它起作用了。但最后返回“:”。如何删除?Martynas,你说列出的是文件,不是文件夹。要使
ls
停止展开文件夹,请添加
-d
选项。
#!/bin/sh

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