On Sat, Jun 25, 2022 at 09:45:58AM -0400, Greg Wooledge wrote: > On Fri, Jun 24, 2022 at 07:42:25PM -1000, Joel Roth wrote: > > I list the files first: > > > > ls some-pattern > > > > then add a pipe to rm: > > > > ls some-pattern | rm > > > > or > > > > ls some-pattern | rm -rf > > Those commands do not work. rm does not read a list of files from stdin. > > Even if you were to add xargs, those commands still would not work in > all cases. They would only work in the simplest cases, where none of > the filenames contain whitespace, single-quote characters, or double-quote > characters. > > That's because xargs does not split its input on newlines. It splits > its input on "quoted words". Like this: > > unicorn:~$ echo 'a list of "quoted words"' | xargs printf '<%s>\n' > <a> > <list> > <of> > <quoted words> > > Any unbalanced single or double quote will cause an error: > > unicorn:~$ echo "I don't know.mp3" | xargs printf '<%s>\n' > xargs: unmatched single quote; by default quotes are special to xargs unless > you use the -0 option > <I> > > And even if xargs *did* have some option to split its input only on > newlines, a filename that *contains* a newline would still break it. > > Finally, ls does not always reproduce filenames exactly. There are > some systems (I'm not sure about all versions of Debian, but definitely > some Unix systems) where certain characters will be printed as > question marks by ls. That means any file containing one of those > characters would make the ls|xargs rm construct fail. > > If you want to use ls as a preview for what will be removed, that's > perfectly fine. You just can't use "up arrow | xargs rm" as your > follow-up command. Instead, use "up arrow" and then use command editing > to replace the ls with rm.
I was actually using 'xargs rm' in an alias. Thanks for pointing out the limitations. -- Joel Roth