Dado bash, esto podría ser más fácil ya que
$ comm <(ls -a dir1) <(ls -a dir2)
La <(command)
expresión ejecuta el comando sobre una tubería y sustituye una /dev/fd
referencia:
mress:10018 Z$ echo <(ls)
/dev/fd/11
Por lo tanto, el comando anterior se ejecuta ls -a
en cada directorio y alimenta sus resultados como argumentos de archivo comm
, que genera hasta 3 columnas, con sangría de tabulación: entradas solo en el primero, entradas en ambos, entradas en el segundo. (Es decir, si está en ambos, entonces está sangrado por una pestaña, si solo está en el segundo está sangrado por 2 pestañas). También puede suprimir columnas por número: comm -1 foo bar
muestra solo las líneas en ambos y las líneas en el segundo archivo, este último sangrado por una pestaña. (Esto se usa más comúnmente al suprimir todo menos la columna que desea: comm -13 foo bar
muestra solo las líneas en común).
Dado que desea aquellos en el primer directorio, eso se traduce en
$ comm -23 <(ls -a dir1) <(ls -a dir2)
Si necesita algo más que solo si está presente, use diff -r
, que generará diferencias para los archivos en común y un mensaje de una línea para los archivos que se encuentran solo en uno u otro.
ls
vendrá con todos los problemas con espacios en blanco, pestañas, avances de línea, espacios de fondo y demás en los nombres de archivo.ls -b
.find
. Pero mi queja principalfind
es que es un mazo muy pesado para aplastar lo que generalmente es una mosca bastante pequeña.Y aquí un guión puro. Estos son los directorios ayb:
Aquí está el comando:
salida:
Cambie a y b por archivos en a pero no en b. Los ! Es una negación. -e prueba de -existencia. En prosa: "Probar si no existe el archivo encontrado en a en ../b".
Nota: Tienes que sumergirte en un primero, para obtener nombres sin 'a'. Para la segunda comparación que tiene que cd
../b
.fuente
Si prefiere una herramienta gráfica, use
Es posible que deba instalarlo primero. Programas similares son
El comandante de medianoche tiene un
compare directories
comando incorporado, que funciona bien, si no va por subdirecciones.fuente
Podrías usar el
join
comando descuidado . Aquí algunas configuraciones para dos directorios de ejemplo, d1 / y d2 /, cada uno de los cuales tiene algunos archivos con nombres únicos para el directorio, y algunos archivos con nombres en común con el otro directorio. Este es solo un ejemplo, por lo que utilicé nombres de archivo de una letra para ilustrar nombres de archivo únicos para uno u otro, y nombres de archivo en común.Para mí, muestra archivos como este:
ACTUALIZACIÓN: Desearía hacer cosas diferentes en la vida real para acomodar archivos con espacios en blanco, ya que
join
utiliza el primer campo "delimitado por espacios en blanco" para decidir qué líneas son únicas y qué líneas son comunes.fuente
join -t ''
(sin delimitador) ayudaría en ese caso.d2/f
perod2/f
. Las pestañas y las nuevas líneas en los nombres de archivo son raras, pero están permitidas.Puedes usar
find
yawk
para resolver esto.Con el siguiente diseño:
Parte uno:
La segunda parte:
Esto se compara con una
comm
solución:Y a una
join
solución:fuente
usa mis funciones:
fuente