我一直在使用以下命令列出当前目录下任意深度的十个最大文件:
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print $0}'
(我用awk
而不是head
来防止管道破裂错误当列表太长时)
它工作得很好,但显然很难记住并每次都输入。我尝试将其放入 .bash_aliases 中,但它不起作用(它打印了 10 个空行)。
如果我使用less
而不是awk
,输出会正确显示,但这意味着显示大于 10MB(我的下限)的整个文件列表,按大小排序,而不仅仅是前面的文件。
那么,awk
这里是什么让 choke 作为别名命令的一部分(假设这确实是问题所在),我该怎么做才能修复它?
答案1
当将此命令用作别名时,$0
它不再受单引号保护,因此会转换为您的 shell 名称。这些命令演示了这一点:
$ alias F="echo '$0'"
$ F
bash
shell 名称(可能bash
)恰好未设置awk变量名,导致空行。
防止 shell 扩展的一种方法$0
是使用类似以下的方法:
alias F="find -type f -size +1k -exec ls -gGsSh1 {} + | awk 'NR<=10 {print \$0}'"
然而,由于这$0
没用,您可以将其从awk
语句中删除。
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print}'
您可以进一步删除整个块,因为打印选定的行是awk
默认行为:
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10'
或者,您可以继续使用head
并丢弃错误消息:
find -type f -size +10M -exec ls -gGsSh1 {} + 2>&1 | head