Trova i file in una directory non in un'altra


12

Esistono strumenti Linux / Unix che trovano tutti i file in una directory non presenti in un'altra? Fondamentalmente sto cercando diff che funziona sull'output di ls.

Sono apprezzati anche script brevi e dolci.

Risposte:


20

diff fa già questo:

diff dir1 dir2

Esempio di output:

Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt

5
Questo è buono. Unico inconveniente: diff è effettivamente in esecuzione su ciascuno dei file che si trovano in entrambi. C'è un'opzione oscura per correre solo contro i nomi dei file (potrei averlo perso)? Altrimenti, suggeriscodiff dir1 dir2 | grep "Only"
Willi Ballenthin,

wow questo mi fa risparmiare molti minuti di scripting bash grazie
user5359531


4

Come le persone ti hanno detto qui, puoi utilizzare DIFF in varie varianti di utilizzo. O semplicemente usi dirdiffinvece, che è pensato per quello che stai provando! :-)

Ma se vuoi mantenere sincronizzate alcune directory, allora dovresti davvero dare un'occhiata rsync.

Saluti


3

Se vuoi farlo anche attraverso tutte le sottodirectory, un buon modo per farlo è:

diff --brief -r dir1/ dir2/

Preferisco usare brief, ma puoi lasciarlo fuori se vuoi.


1

for i in $(ls -1 directory1); do if (test -f directory2/$i) then echo $i; fi; done


0

Questo funziona ..

ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2

0

non testato:

find /dir/A -printf "%P" | while read f; do
  if [ ! -e "/dir/B/$f" ]; then
    echo $f
  fi
done

0

Dennis Williamson aveva una buona risposta , ma dovevo farlo in modo ricorsivo. GNU findutils 4.7.0 non ordina il suo output, quindi ecco cosa ho usato

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort)

Per fare questo in un solo modo e produrre un elenco di file, ho usato questo:

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort) \
| grep '< ./' | sed "s,< ./,$dir1/,"

Affinché ciò funzioni correttamente, né $ dir1 né $ dir2 dovrebbero includere la barra finale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.