I have the following command:
find / -name libGL.so.1
Which returns lots of lines with “Permission denied”. I want to exclude such lines, so I added the following:
find / -name libGL.so.1 | grep -v 'denied'
But the output is the same – my grep -v 'denied' is not filtering out the lines with Permission denied. I’ve tried many variations, looked over grep tutorials, but I cannot figure out the problem. Any suggestions?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
That’s nothing to do with grep – it’s because the pipe | redirects the standard output stream stdout whereas the Permission denied messages are in the standard error stream stderr. You could achieve the result you want by combining the streams using 2>&1 (redirect the stream whose file descriptor is 2 to the stream whose file descriptor is 1) so that stderr as well as stdout gets piped to the input of the grep command
find / -name libGL.so.1 2>&1 | grep -v 'denied'
but it would be more usual to simply discard stderr altogether by redirecting it to /dev/null
find / -name libGL.so.1 2>/dev/null
Using |& instead of 2>&1 |
If you take a look at the Bash man page you’ll likely notice this blurb:
If
|&is used, the standard error of command is connected to command2’s standard input through the pipe; it is shorthand for2>&1 |.
So you can also use this construct as well if you want to join STDERR and STDOUT:
find / -name libGL.so.1 |& grep -v 'denied'
Method 2
Your command should be:
find / -name libGL.so.1 2>/dev/null
Find is complaining about permissions on standard error (fd2). In order to eliminate those lines, redirect (>) standard out to the bit bucket (/dev/null).
Method 3
The “permission denied” lines are going to the stderr (standard error) stream, but you are piping stdout (standard out) through grep.
You can redirect away stderr entirely with
find / -name libGL.so.1 2> /dev/null
Method 4
Have you tried calling the command with sudo?
sudo find / -name libGL.so.1
If it still shows the message, use the already mentioned redirect of stderr (fd=2) to nirvana (/dev/null):
sudo find / -name libGL.so.1 2> /dev/null
More ideas here, good luck!
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0