抑制命令的特定输出行

抑制命令的特定输出行

我想搜索以chrom/var目录中。所以我执行了这个

$ ls -R | grep "^chrom"

令我惊讶的是,它表明。很少有起始行是这样的:

amit@ElMaverick:/var$ ls -R | grep "^chromium"

chromium-browser_55.0.2883.87-0ubuntu0.16.04.1263_amd64.deb
chromium-browser-l10n_55.0.2883.87-0ubuntu0.16.04.1263_all.deb
chromium-codecs-ffmpeg-extra_55.0.2883.87-0ubuntu0.16.04.1263_amd64.deb
ls: cannot open directory './cache/apt/archives/partial': Permission denied
ls: cannot open directory './cache/cups': Permission denied
ls: cannot open directory './cache/ldconfig': Permission denied
chromium-browser_chromium-browser.png
chromium-browser_chromium-browser.png
chromium-bsu_chromium-bsu.png
chromium-browser_chromium-browser.png
ls: cannot open directory './lib/apt/lists/partial': Permission denied
ls: cannot open directory './lib/bluetooth/78:0C:B8:46:10:D5': Permission denied
chromium-browser.conffiles
chromium-browser-l10n.list
chromium-browser-l10n.md5sums
chromium-browser.list
chromium-browser.md5sums
chromium-browser.postinst
chromium-browser.prerm
chromium-codecs-ffmpeg-extra.list
chromium-codecs-ffmpeg-extra.md5sums
ls: cannot open directory './lib/mysql': Permission denied
ls: cannot open directory './lib/mysql-files': Permission denied

我不想在输出中看到这些行。

ls: cannot open directory

所以,我有两个问题:

  1. 如何仅过滤那些没有任何类型错误的行?
  2. 有没有办法抑制特定的输出行?

请提供解决该问题的一般方法,而不仅仅是针对该问题。

答案1

  1. 将标准错误流重定向ls/dev/null

    ls -R 2>/dev/null | grep '^chrom'
    
  2. 进一步进行 grep 操作:

    ls -R 2>/dev/null | grep '^chrom' | grep -v 'some additional pattern'
    

您也可以考虑使用find为什么*不*解析`ls`?):

find . -name 'chrom*' ! -name 'some additional pattern' 2>/dev/null

请注意,find使用文件名通配模式,同时grep使用正则表达式。您find还可以专门查找文件(带有-type f)或目录(-type d)等,例如

find . -type f -name 'chrom*' ! -name 'some additional pattern' 2>/dev/null

命令的每个部分都find类似于针对找到的路径名的“测试”。-type针对文件类型进行测试,同时-name针对路径的最终文件名部分进行测试。这些测试在逻辑上通过 AND 组合在一起(除非-o使用)。感叹号颠倒了测试的意义。

答案2

更好的利用对于此类任务来说,它是更好的套件:

作为简单用户(因为您无权以非 root 身份读取文件):

$ find /var -type f -name 'chrom*' 2>/dev/null

或者作为根:

# find /var -type f -name 'chrom*'

如果你想过滤掉某个特定的错误, 使用 :

command 2> >(grep -v 'specific error')

警告

永远不要解析ls输出!

相关内容