Finden Sie die gemeinsamen Dateien zwischen mehreren Verzeichnissen?

9

Ich möchte Verzeichnisse von Drupal-Themen vergleichen. Ein Drupal-Thema ist ein Verzeichnis, das aus mehreren Dateien besteht, und ich versuche herauszufinden, welche wesentlich sind. Zum Beispiel könnten sie alle eine Datei namens template.phpoder haben page.tpl.php.

Wie finde ich den Satz aller gemeinsamen Dateien für mehrere Verzeichnisse? In meinem Fall befinden sich alle "gleichen" Dateien (mit demselben Namen) im selben Verzeichnis.

user394
quelle
Es gibt einige Antworten im Abschnitt 'Shell Puzzle' von ukuug.org/newsletter/10.4 (obwohl sie Shell-Golf-ish sind).
James Youngman

Antworten:

7

Listen Sie alle Namen (nicht Pfade) von Dateien auf, die allen Verzeichnissen gemeinsam sind.

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"

Oder rufen Sie es als Skriptdatei oder Funktion mit den Verzeichnissen als Parametern auf.

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

Sie können eine Liste von Namen anzeigen, die nach der Anzahl der Verzeichnisse sortiert sind, in denen sie angezeigt werden.

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
Gilles 'SO - hör auf böse zu sein'
quelle
0

Mit Meld können Sie zwei Verzeichnisse vergleichen und sehen, welche Dateien in einem vorhanden sind und nicht in dem anderen und umgekehrt. Es kann auch die Unterschiede zwischen den allgemeinen Dateien anzeigen.

Bernhard
quelle
0

Für 3 Verzeichnisse, eines davon das aktuelle und zwei 'a' und 'b', können Sie den Test wie folgt verketten:

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

wenn die Dateien ein gemeinsames Muster haben (wie .php) und keine Leerzeichen in Dateinamen enthalten.

Die Verwendung lsin Skripten ist immer problematisch und ich rate normalerweise davon ab, sie zu verwenden. Wenn Sie jedoch einen Überblick über alle Dateien in dem Verzeichnis haben, in dem die Suche beginnt, und keine Leerzeichen oder Sonderzeichen wie "*" oder "enthalten? "," <"oder" | "sollte gespeichert werden, um es zu verwenden.

Benutzer unbekannt
quelle