GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso fare in modo che 'diff -X' ignori percorsi specifici e non nomi di file?

Le directory degli elenchi dovrebbero funzionare; ad esempio, ecco cosa ho usato in uno script (supponendo che gnu diff),

diff -r \
   --exclude="*~" \
   --exclude=".svn" \
   --exclude=".git" \
   --exclude="*.zip*" \
   --exclude="*.gz" \
   --exclude="*.tar" \
   ...etc

...che ignora i contenuti di .svn e .git dirs, ma anche singoli file denominati *.zip /*.gz /ecc.

Modifica: Per filtrare i percorsi della forma dir_a/file1 ma ancora diff file con lo stesso nome di base, come dir_b/file1 o dir_a/b/file1 , quindi un elenco di file in diff dovrebbe essere generato (ad esempio, utilizzando find ) e il file da confrontare derivato da questi percorsi; es., dato

$ find ONE TWO -type f -print 
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt

si genera l'elenco dei file da confrontare, escludendo ad esempio */a/2.txt ma ancora confrontando altri file denominati 2.txt . Basta "trovare" tutti i file tranne ONE/a/2.txt (può anche essere usata una regexp qui, come .*/a/2.txt )

$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
    -exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;  

che in effetti ignora ONE/a/2.txt (e TWO/a/2.txt ), ma confronta ancora gli altri file denominati 2.txt :

diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt

Modifica: Oppure, più divertimento con find (divertimento aggiuntivo lasciato come esercizio per il lettore), seleziona i file o le directory da escludere e poi diff tutto il resto:

$ find ONE \( -regex 'ONE/a/2.txt' -o -name b  -prune \)  \
    -o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \

L'esempio precedente esclude il file specifico "{top}/a/2.txt", qualsiasi directory chiamata "b", e tutto il resto è diff'd. (Invece del semplice "-name b " potresti anche usare "-regex '.*/b' " - nota, nessuna "/".)


Ho avuto lo stesso problema quindi ho creato una patch per diff . La patch deve ancora essere accettata, ma puoi creare la tua versione di diff con la patch o installa su Arch Linux con un pacchetto AUR.

Ecco il diff patch.


Per escludere la directory directory/sub-directory , io uso

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

Tuttavia, anche se dovrebbe funzionare per una singola esclusione, non dovrebbe essere possibile per un lungo elenco ignorato come hai fatto tu.


Linux
  1. Come rendere il file sparse?

  2. Come posso trovare un file specifico da un terminale Linux?

  3. Come posso rendere permanentemente un file di sola lettura su Linux in modo che anche root non possa modificarlo?

  4. Come ordinare ls per estensione di file e quindi per nome?

  5. Come si esegue il gunzip di un file e si conserva il file .gz?

Comprendere i percorsi dei file e come usarli in Linux

Come lavorare con hardlink e softlink in Linux

come posso differenziare due sezioni dello stesso file?

Come posso verificare che un file esista ed eseguire un comando in caso contrario?

Come posso eliminare una nuova riga se è l'ultimo carattere in un file?

Come toccare un file e mkdir se necessario in una riga