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.php
o 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 ls
en 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.