Дана 24/05/11 07:41PM, Walter Alejandro Iglesias написа:
> Today I realized that the loop above is not necesary:
> 
> -----------------------------------------------------------
> dirs=$(echo "$files" | grep '/$')
> 
> cd && find $dirs | sort | uniq > $source_list
> cd $target && find $dirs | sort | uniq > $target_list
> diff $source_list $target_list |\
>        awk '/^> / { print "'$target'/" $NF }' > $delete_list
> 
> cat $delete_list | sed 's/^/delete /'
> rm -rf $(cat $delete_list | xargs)
> 
> # Clean
> rm $source_list $target_list $delete_list
> ----------------------------------------------------------------

A few notes:

- You don't need a backslash after a pipe (|) or a list operator (||
  and &&) - a line ending with a pipe is an incomplete pipeline. So 
  (with added quoting):

  diff "$source_list" "$target_list" |
        awk '/^> / { print "'"$target"'/" $NF }' > "$delete_list"

  As an example for a list operator, the second line beginning with cd
  could also be written as:

  cd "$target" &&
        find "$dirs" | sort | uniq > "$target_list"

  This works even when entering commands interactively from the command 
  line.

- Before the `rm -rf` line, a useless use of cat[1]:

  sed 's/^/delete /' "$delete_list"

- The xargs is unnecessary in `rm -rf $(cat $delete_list | xargs)`; 
  BTW, that line is vulnerable to weird pathnames (for example, 
  those including spaces, line feeds and special characters).


[1]: https://porkmail.org/era/unix/award

Reply via email to