3

ls -lrt | awk ' !/dly/ { print $NF } ' | awk ' /000001.txt.gz/ { print } '

我想显示符合以下条件的文件名:1)不应包含“dly”关键字。2)应包含“000001.txt.gz”关键字。

我使用了上面的命令。是否可以合并我使用的 2 个管道?

4

3 回答 3

4

这不使用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'
于 2012-10-23T14:48:42.250 回答
2

您可以将条件组合起来,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 中做到这一点的。

于 2012-10-23T14:06:16.590 回答
1
ls -lrt | awk ' !/dly/ && $NF~/000001.txt.gz/ { print $NF }'
于 2012-10-23T16:59:48.693 回答