我想按时间列出并排序所有匹配特定模式的文件,然后只获取前 20 个:
ls -laths *.txt | head -20
这很有效,例如,如果我创建两个文件:
touch 1.txt
touch 2.txt
上述命令的结果是:
$ ls -laths *.txt | head -20
1,5K -rw-rw---- 1 user user 0 20. Apr 09:49 2.txt
1,5K -rw-rw---- 1 user user 0 20. Apr 09:49 1.txt
如果我在终端上执行此操作,效果很好。但是当尝试将其保存为别名时(其中输入 $1 是我想要的模式),如下所示:
alias lis20='function _(){ ls -laths "${1}" | head -20; }; _'
然后当我使用别名时,我得到:
$ lis20 *.txt
1,5K -rw-rw---- 1 user user 0 20. Apr 09:49 1.txt
这意味着它只列出第一个文件。我已经尝试了内部变量的几次扩展,如下所示问题,但没有任何成功。
我正在使用 zsh,但如果有一个同时适用于 bash 和 zsh 的解决方案就好了。
答案1
别名是文本扩展,因此lis20 *.txt
别名首先扩展为
function _(){ ls -laths "${1}" | head -20; }; _ *.txt
然后文件名生成将函数调用变成
_ abc.txt def.txt etc.txt
so 在函数中,$1
仅包含第一个匹配的文件名。
现在,您可以通过在函数中使用而不是来解决这个问题...("$@"
很神奇:尽管有引号,它还是扩展为多个单词,所有参数都是单独且完整的。)"$1"
"$@"
但是,你真的不需要一个函数和无论如何,一个别名。只需将其设为单个函数即可:
lis20() {
ls -laths "$@" | head -20
}