wal*_*ous 3 command-line bash alias awk
我一直在使用以下命令列出当前目录下任意深度的十个最大文件:
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print $0}'
Run Code Online (Sandbox Code Playgroud)
(当列表太长时,我使用awk而不是head防止管道损坏错误)
它运行良好,但显然很难每次都记住和输入。我试着把它放在 .bash_aliases 中,但它不工作(它打印 10 个空行)。
如果我使用less而不是awk,则输出会正确显示,但这意味着显示大于 10MB(我的较低阈值)的整个文件列表,按大小排序,而不仅仅是顶部的。
那么,是什么使awkchoke 成为别名命令的一部分(假设这确实是问题所在),我该怎么做才能解决它?
将此命令用作别名时,$0不再受单引号保护,因此将转换为您的 shell 名称。这些命令演示了它:
$ alias F="echo '$0'"
$ F
bash
Run Code Online (Sandbox Code Playgroud)
shell 名称(大概bash)恰好是一个未设置的awk变量名称,导致空行。
防止$0外壳扩展的一种方法是使用以下内容:
alias F="find -type f -size +1k -exec ls -gGsSh1 {} + | awk 'NR<=10 {print \$0}'"
Run Code Online (Sandbox Code Playgroud)
但是,由于这$0是无用的,您可以将其从awk语句中删除。
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print}'
Run Code Online (Sandbox Code Playgroud)
您可以进一步删除整个块,因为awk无论如何打印所选行都是默认行为:
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10'
Run Code Online (Sandbox Code Playgroud)
或者,您可以继续使用head并丢弃错误消息:
find -type f -size +10M -exec ls -gGsSh1 {} + 2>&1 | head
Run Code Online (Sandbox Code Playgroud)