trovare il set di file comuni tra più directory?


9

Sto cercando di confrontare le directory dei temi di Drupal. Un tema drupal è una directory composta da diversi file e sto cercando di capire quali sono essenziali. Ad esempio, potrebbero avere tutti un file chiamato template.phpo page.tpl.php.

Come posso trovare l'insieme di tutti i file comuni per diverse directory? Nel mio caso, tutti gli 'stessi' file (quelli con lo stesso nome) saranno nella stessa directory di livello.


Ci sono alcune risposte nella sezione "Shell Puzzle" di ukuug.org/newsletter/10.4 (anche se sono shell-golf-ish).
James Youngman,

Risposte:


7

Elenca tutti i nomi (non i percorsi) dei file comuni a tutte le directory.

dirs=( "A dir" "B dir" "C dir" "D dir" )
find "${dirs[@]}" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *${#dirs[@]} //p"

Oppure chiamalo come file di script o funzione, con le directory come parametri.

find "$@" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *$# //p"

1

È possibile visualizzare un elenco di nomi ordinati per numero di directory in cui compaiono.

find */ |              # traverse all the template directories
sort -t / -k 2 |       # sort, ignoring the first field
tr '/' '\t' |          # turn / into tabs
uniq -f 1 -c |         # count duplicates, ignoring the first field
tr '\t' '/' |          # turn tabs back into /
sort -t / -s -k 1n     # sort by the number of occurrences

0

Con Meld puoi confrontare due directory e vedere quali file sono presenti in uno e non nell'altro e viceversa. Può anche mostrare le differenze tra i file comuni.


0

Per 3 directory, una delle quali è la corrente e due "a" e "b", è possibile concatenare il test in questo modo:

ls a/$(ls b/$(ls *.php) 2>/dev/null) 2>/dev/null

se i file hanno un modello comune (come .php) e non contengono spazi bianchi nei nomi dei file.

L'uso lsnegli script è sempre problematico e di solito mi scoraggio dall'usarlo, ma se si dispone di una panoramica di tutti i file nella directory in cui inizia la ricerca e non contiene spazi bianchi né caratteri speciali come "*" o "? "," <"o" | ", deve essere salvato per usarlo.

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.