ls -lrt | awk ' !/dly/ { print $NF } ' | awk ' /000001.txt.gz/ { print } '
我想显示符合以下条件的文件名:1)不应包含“dly”关键字。2)应包含“000001.txt.gz”关键字。
我使用了上面的命令。是否可以合并我使用的 2 个管道?
这不使用awk
,但它确实减少了管道的数量。
find -name "*dly*" -o -name "*000001.txt.gz*" -exec basename {} \;
编辑:添加了Zack建议的更改(对于 GNU find
)
find -maxdepth 1 -name "*dly*" -o -name "*000001.txt.gz*" -printf '%f\n'
您可以将条件组合起来,awk
就好像它们是 C 表达式一样,所以
ls -lrt | awk '/000001\.txt\.gz/ && !/dly/ { print $NF }'
应该管用。(根本没有经过测试。)但是,如果您想要针对不寻常的事情(例如文件名中的空格)提高效率和鲁棒性,那么您应该这样做:
ls -1rt | awk '/000001\.txt\.gz/ && !/dly/ { print }'
只要您的文件名中没有换行符,这将是可靠的。(唯一的字节值——不是字符;内核不知道字符编码——不能出现在路径名组件中的是 0x2F 和 0x00,但你通常不必担心,除非你正在编写一个必须处理恶意文件名。)另一种选择是使用更强大的语言,可以opendir
:
perl -le 'opendir(my $dh, ".") or die;
print for sort grep { /00001\.txt\.gz/ && !/dly/ } readdir $dh'
或更简洁(但效率较低)
perl -le 'print for sort grep { /00001\.txt\.gz/ && !/dly/ } glob("*")'
不过,这并不像这样ls -rt
。我不记得你是如何在 Perl 中做到这一点的。
ls -lrt | awk ' !/dly/ && $NF~/000001.txt.gz/ { print $NF }'