¿Encontrar el conjunto de archivos comunes entre varios directorios?

¿Encontrar el conjunto de archivos comunes entre varios directorios?

Estoy buscando comparar directorios de temas de Drupal. Un tema drupal es un directorio compuesto por varios archivos y estoy tratando de determinar cuáles son esenciales. Por ejemplo, es posible que todos tengan un archivo llamado template.phpo page.tpl.php.

¿Cómo puedo encontrar el conjunto de todos los archivos comunes para varios directorios? En mi caso, todos los archivos "iguales" (los del mismo nombre) estarán en el mismo directorio de nivel.

Respuesta1

Enumere todos los nombres (no rutas) de archivos comunes a todos los directorios.

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"

O llámelo como un archivo de script o una función, con los directorios como parámetros.

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

Respuesta2

Puede mostrar una lista de nombres ordenados por la cantidad de directorios en los que aparecen.

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

Respuesta3

Confusionarpuede comparar dos directorios y ver qué archivos están presentes en uno y no en el otro y viceversa. También puede mostrar las diferencias entre los archivos comunes.

Respuesta4

Para 3 directorios, uno de ellos el actual, y dos 'a' y 'b', puedes encadenar la prueba así:

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

si los archivos tienen un patrón común (como .php) y no contienen espacios en blanco en los nombres de los archivos.

Usar lsen Scripts siempre es problemático y normalmente desaconsejo usarlo, pero si tiene una descripción general de todos los archivos en el directorio donde comienza la búsqueda y no contiene espacios en blanco ni caracteres especiales como "*" o "? ", "<" o "|", debe guardarse para usarlo.

información relacionada