no, questo no
Codice: Seleziona tutto
for file in $(<file_list);
do
if ! grep -m 1 -q "^${file#/}\(\.new\)\?/\?$" /var/log/packages/* && ! grep -m 1 -q "^${file#/}$" other_files
then
echo $file
fi
done
perchè ti vuoi del male!..., anzi, perchè vuoi del male ai processori!!!???
semmai vuoi confrontare file per file
if ! cat /var/log/packages/* other_files |grep ....
...
oppure se proprio vuoi andare di grep
cat /var/log/packages/* other_files|sed 's/^/\//' > slack_files
grep -f slack_files file_list
(o il contrario con -v e/o qualcos'altro)
ma ottieni ancora complessità computazionale N^2
risultati lineari li trovi con diff
sort -u slack_files > slack_files.sort
sort -u file_list > file_list.sort
diff slack_files.sort file_list.sort
100.000 volte più veloce.
# wc -l file_list
598922 file_list
# cat /var/log/packages/* other_files |wc -l
402115
mi aspetto un output di c.a. 200000 file.
in mezzora di esecuzione sono a 36000 (e sto cuocendo il processore).
Lo fermo quì.
la diff mi ci ha messo circa un secondo
(ed ho sia i file di troppo che i file mancanti). La sort 3 secondi. Il collo di bottiglia è solo nella find.
Interessante aggiunta da mettere potrebbe essere che se in una alberatura di directory non c'è neanche un file di slackware, allora mi venga mostrata solamente la directory.
Per esempio, un pacchetto installato dai sorgenti con il make install classico, e --prefix=/opt/programma. Se questo pacchetto ha 10000 file, è molto più utile che mi venga mostrata solo la directory /opt/programma.
Se la cosa funziona bene non servirebbe neanche mettere la /root come eccezione. Semplicemente ti direbbe "dentro /root ci sono file".