GNU Coreutils Gotchas
pixelbeat.org
pixelbeat.org
$ du -hs big.log
199M big.log
$ cat big.log | time tr 'a' 'b' | md5
27.22 real 23.70 user 0.43 sys
c171314106134f6fde035b11f4354464
$ cat big.log | time gtr 'a' 'b' | md5
1.05 real 0.30 user 0.23 sys
c171314106134f6fde035b11f4354464The yes command (which is generally useful for generating repetitive text):
$ yes-old | pv > /dev/null ^C
... 55.8MiB/s ...
$ yes-new | pv > /dev/null ^C
... 3.44GiB/s ...
Details on that fairly simple change are at http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=commitdiff;h...Also we more than doubled the speed of wc -l (by avoiding function call overhead):
$ yes | pv | wc-old -l ^C
... 230MiB/s ...
$ yes | pv | wc-new -l ^C
... 558MiB/s ...
Also we now generate an infinite stream of integers more efficiently too: $ seq-old inf | pv > /dev/null ^C
... 13.3MiB/s ...
$ seq-new inf | pv > /dev/null ^C
... 497MiB/s ...At any rate, removing list permissions from directories is probably not what you want to do.
That find even have actions are one of those big unix oddities.
$ basename $PWD
etc
$ echo $PWD | basename
<this prints nothing>
I even reported it decade ago but nobody cares.Summary of that is you can filter using xargs like:
get_file_paths | xargs basename -a
No point having two ways to do something,
especially when there are caveats about enabling stdin processingBecause a lot of people have use for a filter version
> It doesn't act as a filter, processing a stream of data, but rather as a plain function.
That's the problem with a lot commands, some work as filters, some as simple commands, and other do both. The reasoning on the decision is confusing.
[edit: yes, combining with xargs will often work]
$ echo ${PWD##*/}
etc
use your shell to its full power basename `echo $PWD`Can you give an example where I have a file (a.txt) of 100 file names and need the basename of each? I'm pretty sure dvh just used echo to show a simple example, not an actual use.
while read line ; do basename "$line" ; done < a.txt for f in $(cat a.txt); do basename "$f"; done2. The shell will expand * and ? (maybe others) in the filenames
xargs basename -a < a.txt