linux shell获取文件名
我正在写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命令获取文件,也可以使用“文件全局绑定
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)