我正在尝试在ls
上编写一个包装器,它将输出与可选模式匹配的最近修改过的文件。
例如,lst *pdf
应输出以pdf
结尾的最近修改过的文件。
以下代码有效,但前提是我将参数括在引号中。 (我必须输入lst "*pdf"
)。
#!/bin/bash
param="$1"
ls -1tr $param | tail -1
如果我不使用引号,我会按字母顺序获得与模式匹配的第一个文件。原因必须是这是由shell插入*pdf
时返回的第一个项目,因此它将*pdf
的扩展传递给我的脚本,而不是"*pdf"
。
那我该怎么办?我怀疑我必须使用ls
本身所使用的原始函数来重写脚本。
答案 0 :(得分:1)
我为您准备了以下脚本:
$ cat ls2.sh
#!/bin/bash
param="$@"
for f in "${param:=*}"
do
stat -c '%Y %n' $f
done | sort -k1 -n | tail -1 | cut -d' ' -f2
在当前文件夹中:
$ ls -1tr
ls2.sh
2.pdf
1.pdf
3.pdf
1.txt
2.txt
3.txt
输出:
$ ./ls2.sh
3.txt
$ ./ls2.sh *.pdf
3.pdf
$ ./ls2.sh 3.txt
3.txt
$ ./ls2.sh *
3.txt
解释:
我使用stat -c '%Y %n' $f
显示文件的修改时间和文件名,param="$@"
我获取传递给脚本的所有参数,如果为空,我将其替换为*
与ls命令具有相同的行为