在bash

时间:2018-02-12 02:39:30

标签: bash

我正在尝试在ls上编写一个包装器,它将输出与可选模式匹配的最近修改过的文件。

例如,lst *pdf应输出以pdf结尾的最近修改过的文件。

以下代码有效,但前提是我将参数括在引号中。 (我必须输入lst "*pdf")。

#!/bin/bash
param="$1"
ls -1tr $param | tail -1

如果我不使用引号,我会按字母顺序获得与模式匹配的第一个文件。原因必须是这是由shell插入*pdf时返回的第一个项目,因此它将*pdf的扩展传递给我的脚本,而不是"*pdf"

那我该怎么办?我怀疑我必须使用ls本身所使用的原始函数来重写脚本。

1 个答案:

答案 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命令具有相同的行为