¿Cómo puedo listr los files de los cuales no existen enlaces simbólicos?

Tengo un gran directory "myfiles" lleno de documentos misceláneos y no quiero modificar su estructura.

Por lo tanto, creé (varios) otros directorys para cada class de documentos. Por ejemplo, tengo un directory de "imágenes" que tiene enlaces simbólicos a cada file jpg o cr2 en el directory "myfiles" más otros files descriptivos para cada enlace simbólico (con el mismo nombre de file) con descripción y otros metadatos. Los enlaces simbólicos en el directory / images pueden tener un nombre diferente del file vinculado original.

Estoy tratando de encontrar la forma más sencilla de asegurarme de que todos y cada uno de los files de image en el directory "myfiles" tengan un enlace simbólico en el directory "images".

Vea un ejemplo de la estructura de carpetas

/myfiles/a.doc /myfiles/b.jpg /myfiles/c.cr2 /myfiles/d.mov 

debería resultar

 /images/b_800x600.jpg /images/b_800x600.desc /images/c_3820x5640.cr2 /images/c_3820x5640.cr2 

Si respondo correctamente a la pregunta, necesita los files en myfiles que no tienen enlaces simbólicos en las imágenes:

 #!/bin/bash OIFS="$IFS" IFS=$'\n' files="$(find myfiles/ -type f -name '*.jpg' -or -name '*.cr2')" for f in $files; do list="$(find -L images/ -xtype l -samefile "$f")" if [[ "$list" == "" ]]; then echo "$f does not have symlink." fi done IFS="$OIFS" 

Hay una advertencia con este enfoque si tienes un file a.jpg en el directory myfiles / 1 y tienes un enlace simbólico a ese file en el directory images / 3 o simplemente en imágenes / el file no se informará con el enlace simbólico perdido.

Supongo que los files en myfiles no son enlaces simbólicos, y que ninguno de los nombres de file contiene líneas nuevas. (Mi enfoque aún puede funcionar si se violan estas suposiciones, pero se vuelve más complicado). También asumo que usted tiene la utilidad de readlink común y que admite -f para canonicalizar las routes, que es el caso en Linux (tanto GNU como BusyBox) , pero no en, por ejemplo, OSX.

Crea una list de files y ordénala para una buena medida:

 find /myfiles -type f -print | sort >all.list 

Elabore una list de objectives simbólicos de enlace, con routes absolutas.

 find /images -type f -exec readlink -f {} \; | sort >linked.list 

Enumere los files que no están vinculados:

 comm -32 all.list linked.txt 

Si usa un shell que admite la sustitución de processs, puede ponerlo todo en un solo command:

 comm -23 <(find /myfiles -type f -print | sort) \ <(find /images -type f -exec readlink -f {} \; | sort) 

Si los enlaces en /images son absolutos, puede usar readlink sin la opción -f , que está disponible bajo * BSD y OSX.