trouver l'ensemble des fichiers communs entre plusieurs répertoires?

9

Je cherche à comparer des répertoires de thèmes Drupal. Un thème drupal est un répertoire composé de plusieurs fichiers, et j'essaie de comprendre lesquels sont essentiels. Par exemple, ils pourraient tous avoir un fichier appelé template.phpou page.tpl.php.

Comment puis-je trouver l'ensemble de tous les fichiers communs pour plusieurs répertoires? Dans mon cas, tous les «mêmes» fichiers (ceux du même nom) seront dans le même répertoire de niveau.

user394
la source
Il y a quelques réponses dans la section «Puzzle Shell» de ukuug.org/newsletter/10.4 (bien qu'elles soient shell-golf-ish).
James Youngman

Réponses:

7

Liste tous les noms (pas les chemins) des fichiers communs à tous les répertoires.

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"

Ou appelez-le comme un fichier de script ou une fonction, avec les répertoires comme paramètres.

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

Vous pouvez afficher une liste de noms triés par le nombre de répertoires dans lesquels ils apparaissent.

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- arrête d'être méchant'
la source
0

Avec Meld, vous pouvez comparer deux répertoires et voir quels fichiers sont présents dans l'un et non dans l'autre et vice versa. Il peut également montrer les différences entre les fichiers communs.

Bernhard
la source
0

Pour 3 répertoires, l'un d'eux étant le courant, et deux 'a' et 'b', vous pouvez enchaîner le test comme ceci:

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

si les fichiers ont un modèle commun (comme .php) et ne contiennent pas d'espaces dans les noms de fichiers.

L'utilisation lsdans les scripts est toujours problématique et je déconseille normalement de l'utiliser, mais si vous avez une vue d'ensemble de tous les fichiers dans le répertoire où la recherche commence, et qu'il ne contient pas d'espaces, ni de caractères spéciaux comme "*" ou "? "," <"ou" | ", il doit être sauvegardé pour l'utiliser.

Utilisateur inconnu
la source