On Sun May 12 10:07:30 2024 Страхиња Радић wrote:
> 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"
I know, just fingers habit. :-)
>
> 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).
>
What about the following, better?
---------------------------------------------
# Remove files from target directory
date=$(date +%H%M%S)
delete_list=/tmp/delete_$date
source_list=/tmp/source_$date
target_list=/tmp/target_$date
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
cd &&
if [ -s $delete_list ]; then
echo "Deleting on ${target}:"
rm -vrf $(cat $delete_list)
fi
# Clean
rm $source_list $target_list $delete_list
---------------------------------------------
Thanks for your recomendations!
--
Walter