首页 > 解决方案 > 使 grep 不改变模式

问题描述

我这样做: file $(ls -td -1 /usr/bin/* | grep zip) 但输出:

/usr/bin/preunzip:     cannot open `/usr/bin/preun\033[01;31m\033[Kzip\033[m\033[K' (No such file or directory)
/usr/bin/prezip:       cannot open `/usr/bin/pre\033[01;31m\033[Kzip\033[m\033[K' (No such file or directory)
...
...

可以看出,通过管道传输到 grep 后,文件名更改为某个垃圾 ( 033[01;31...),因此该file命令无法打开该垃圾。如何使 grep (在被管道之后)不更改用于另一个命令的模式(在我的情况下为文件名)?

PS:没有grep,它通常可以工作 file $(ls -td -1 /usr/bin/*)::

/usr/bin/js:                                 symbolic link to /etc/alternatives/js
/usr/bin/git:                                ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=f400072e5b2d2e09190d4258071d7502497aa5e3, for GNU/Linux 3.2.0, stripped

所以grep问题的原因就在这里

标签: bashshellgrep

解决方案


看起来您想按修改时间的顺序在其名称下的file所有文件上运行?/usr/binzip

file $(find /usr/bin -name "*zip*" -printf "%T@\t%p\n" | sort -t$'\t' -k1,1nr | cut -f2)

将在没有与在脚本中使用输出相关的ls大部分风险的情况下做到这一点。

如果由于某种原因,您在该目录树中的名称中有一个带有空格字符的文件:

find /usr/bin -name "*zip*" -printf "%T@\t%p\0" | sort -zt$'\t' -k1,1nr | cut -zf2- | xargs -0 file

(所有这些都假设 GNU 版本的实用程序)

如果您不关心订单:

find /usr/bin -name "*zip*" -exec file '{}' +

推荐阅读