GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu přimět 'diff -X' ignorovat konkrétní cesty a nikoli názvy souborů?

Výpis adresářů by měl fungovat; např. zde je to, co jsem použil ve skriptu (za předpokladu gnu diff),

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

...který ignoruje obsah .svn a .git dirs, ale také jednotlivé soubory s názvem *.zip /*.gz /atd.

Upravit: Za účelem filtrování cest ve tvaru dir_a/file1 ale stále diff soubory se stejným základním názvem, například dir_b/file1 nebo dir_a/b/file1 , pak seznam souborů do diff by musel být vygenerován (například pomocí find ) a soubor k porovnání odvozený z těchto cest; např. daný

$ 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

vygenerujete seznam souborů k porovnání, s výjimkou například */a/2.txt ale stále porovnáváme další soubory s názvem 2.txt . Stačí "najít" všechny soubory kromě ONE/a/2.txt (lze zde také použít regulární výraz, například .*/a/2.txt )

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

což ve skutečnosti ignoruje ONE/a/2.txt (a TWO/a/2.txt ), ale stále porovnává ostatní soubory s názvem 2.txt :

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

Upravit: Nebo více zábavy s find (další zábava jako cvičení pro čtenáře), vyberte soubory nebo adresáře, které chcete vyloučit a poté diff všechno ostatní:

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

Výše uvedený příklad vylučuje konkrétní soubor "{top}/a/2.txt", jakýkoli adresář s názvem "b" a vše ostatní je rozdílné. (Namísto jednoduchého „-name b " můžete také použít "-regex '.*/b' " - poznámka, žádné koncové "/".)


Měl jsem stejný problém, takže jsem vytvořil opravu na diff . Oprava ještě nebyla přijata, ale můžete si vytvořit svou vlastní verzi diff s opravou nebo nainstalujte na Arch Linux s balíčkem AUR.

Zde je diff patch.


Chcete-li vyloučit adresář directory/sub-directory , používám

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

Ačkoli by to mělo fungovat pro jediné vyloučení, nemělo by to být možné pro dlouhý seznam ignorovaných, jako máte vy.


Linux
  1. Jak mohu zkontrolovat, zda soubor existuje, a provést příkaz, pokud ne?

  2. Jak mohu smazat nový řádek, pokud je to poslední znak v souboru?

  3. Jak v Linuxu nastavím soubor trvale jen pro čtení, aby jej ani root nemohl upravovat?

  1. Jak provést třídění ls podle přípony souboru a poté názvu?

  2. Jak zazipujete soubor a uchováte soubor .gz?

  3. Jak mohu kat soubor a odstranit komentované řádky?

  1. Jak udělat soubor řídký?

  2. Jak udělám, aby soubor NELZE upravovat?

  3. Proč můj crontab nefunguje a jak jej mohu odstranit?