[ale] SOLUTION Re: Keep space separated values sane in a bash "for" loop?

Jerry Yu jjj863 at gmail.com
Mon Apr 9 23:48:32 EDT 2007


The answer is as simple as "find . -maxdepth 1 -mindepth 1 -type d -print0 |
xargs -0 du -sh", without the two extra sed parsing attempts. That was my
initial answer on Apr 5. It even worked on my cygwin port of
bash/find/xargs/du.

/home/jerry/1# find . -maxdepth 1 -mindepth 1 -type d -print0 | xargs -0 du
-sh
0       ./ leading space
8.0K    ./1 4
0       ./1 4 8
8.0K    ./trailing space

On 4/9/07, Christopher Bergeron <christopher at bergeron.com > wrote:
>
> Jerry - I appreciate your input, but your solution does not work as I
> described it.  James' solution works; however it doesn't work in an
> alias as he described.
>
> Your solution:
> find . -maxdepth 1 -mindepth 1 -type d -print0 | sed 's/\ /\\ /g'|sed
> 's/.\///'| xargs -0 du -sh
> does not work as you purported, however, I do appreciate your suggestion.
>
> Kind regards,
> CB
>
>
>
>
> Jerry Yu wrote:
> > your missed the -print0 for find and -0 for xargs. This combo uses
> > NULL to separate fields. Check out my initial reply as well as James's.
> >
> > On 4/9/07, *Christopher Bergeron* <christopher at bergeron.com
> > <mailto:christopher at bergeron.com>> wrote:
> >
> >     Aha!
> >     James, I think you've _mostly_ solved my problem.   I used your
> >     cmdline
> >     (which works), however, it didn't work the way I was applying
> >     it:  as an
> >     alias!
> >
> >     For example:
> >     find . -maxdepth 1 -mindepth 1 -type d | sed 's/\ /\\ /g'|sed
> >     's/.\///'|xargs du -sh     == works perfectly
> >
> >     however...
> >
> >     alias diskpie="find . -maxdepth 1 -mindepth 1 -type d | sed 's/\ /\\
> >     /g'|sed 's/.\///'|xargs du -sh"    == does not work
> >
> >     I have it feeling it has something to do with escaping the quotes,
> but
> >     I'm surprised that alias mungs the string it runs (actually, I'm not
> >     really surprised)...
> >
> >     Kind regards,
> >     CB
> >
> >
> >
> >
> >
> >
> >     James P. Kinney III wrote:
> >     > On Mon, 2007-04-09 at 18:11 -0400, Christopher Bergeron wrote:
> >     >
> >     >> This solution doesn't work with "du" for some reason.
> >     >>
> >     >> #!/bin/bash
> >     >> oldifs=$IFS
> >     >> export IFS=","
> >     >> for i in `ls -m|sed 's/, /,/g'`
> >     >> do
> >     >> du -sH \"$i\"
> >     >> done
> >     >> export IFS=$oldifs
> >     >>
> >     >> It appears its turning all of the elements $i into a single
> >     variable.
> >     >>
> >     >> This code demonstrates:
> >     >>
> >     >> #!/bin/bash
> >     >> oldifs=$IFS
> >     >> export IFS=","
> >     >> for i in `ls -m|sed 's/, /,/g'`
> >     >> do
> >     >> echo du -sh \"$i\"
> >     >> done
> >     >> export IFS=$oldifs
> >     >>
> >     >>
> >     >> What I'm trying to do is create a script that will do "du -sh"
> >     on each
> >     >> directory listed in the current directory. This is what I have
> >     so far:
> >     >>
> >     >> alias diskpie='for i in `\ls -l | grep drwx | tr -s " " | cut
> >     -f9 -d "
> >     >> "`; do du -sh $i; done'
> >     >>
> >     >> It works great unless it encounters a directory with a space in
> >     the name.
> >     >>
> >     >> Anyone have any other ideas?
> >     >>
> >     >>
> >     >
> >     > find . -maxdepth 1 -mindepth 1 -type d | sed 's/\ /\\ /g'|sed
> >     's/.\///'|
> >     > xargs du -sh
> >     >
> >     >
> >     >> Kind regards,
> >     >> Chris
> >     >>
> >     >>
> >     >>
> >     >>
> >     >>
> >     >>
> >     >>
> >     >>
> >     >> Robert Story wrote:
> >     >>
> >     >>> On Fri, 6 Apr 2007 12:18:08 -0400 Robert wrote:
> >     >>> RS> On Thu, 5 Apr 2007 20:13:06 -0400 aaron wrote:
> >     >>> RS> A> Here's technique that might help. I whipped this up for
> >     dealing with
> >     >>> RS> A> spaced names common to audio file that I wanted to
> >     batch convert
> >     >>> RS> A> to mp3.  Works with bash on Mac -- should work with
> >     Linux bash as
> >     >>> RS> A> well. The trick was to pipe the file listing to READ
> >     from STDIN instead
> >     >>> RS> A> of letting a FOR loop parse the input:
> >     >>> RS>
> >     >>> RS> This works great for embedded spaces, but not so much for
> >     spaces at the
> >     >>> RS> beginning or end of a file name...
> >     >>>
> >     >>>
> >     >>> I've had this same problem for a while, and have always done
> >     manual clean-up.
> >     >>> After trying these solutions and reading the ls man page, I
> >     now have a working
> >     >>> solution that handles spaces anywhere in the name.
> >     >>>
> >     >>> #!/bin/bash
> >     >>> oldifs=$IFS
> >     >>> export IFS=","
> >     >>> for i in `ls -m|sed 's/, /,/g'`
> >     >>> do
> >     >>>    echo \"$i\"
> >     >>> done
> >     >>> export IFS=$oldifs
> >     >>>
> >     >>>
> >     >>> Of course, the above will break for files with a ',' in them,
> >     but I can live
> >     >>> with that... the paranoid could add an initial ls|grep to
> >     check and warn for
> >     >>> that case...
> >     >>> _______________________________________________
> >     >>> Ale mailing list
> >     >>> Ale at ale.org <mailto:Ale at ale.org>
> >     >>> http://www.ale.org/mailman/listinfo/ale
> >     >>>
> >     >>>
> >     >>>
> >     >> _______________________________________________
> >     >> Ale mailing list
> >     >> Ale at ale.org <mailto:Ale at ale.org>
> >     >> http://www.ale.org/mailman/listinfo/ale
> >     >>
> >     >>
> >
> ------------------------------------------------------------------------
> >
> >     >>
> >     >> _______________________________________________
> >     >> Ale mailing list
> >     >> Ale at ale.org <mailto:Ale at ale.org>
> >     >> http://www.ale.org/mailman/listinfo/ale
> >
> >     _______________________________________________
> >     Ale mailing list
> >     Ale at ale.org <mailto: Ale at ale.org>
> >     http://www.ale.org/mailman/listinfo/ale
> >     <http://www.ale.org/mailman/listinfo/ale >
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Ale mailing list
> > Ale at ale.org
> > http://www.ale.org/mailman/listinfo/ale
>
> _______________________________________________
> Ale mailing list
> Ale at ale.org
> http://www.ale.org/mailman/listinfo/ale
>
-------------- next part --------------
An HTML attachment was scrubbed...




More information about the Ale mailing list