
Tengo un conjunto de carpetas y un conjunto de *.DAT
archivos.
Quiero eliminar un *.DAT
archivo si no existe ninguna carpeta con el mismo nombre (sin .DAT
).
Me tomó algo de tiempo llegar a esta solución:
find . -type d > dirs.txt
for F in `find *.DAT`
do
F=$(sed 's|\.DAT||g' <<< $F)
if grep "$F" dirs.txt; then
echo "$F found"
else
rm $F.DAT
fi
done
Pero creo que debería haber una solución mucho más sencilla (¿una frase elegante? ¿Sin crear un archivo?...?). ¿Estoy en lo cierto?
Respuesta1
No necesita usar sed
para eliminar .DAT
si está usando bash
: la expansión de parámetros incorporada ${F%.DAT}
logra lo mismo sin usar un subshell ni un programa externo.
Si los directorios estaban en ubicaciones arbitrarias en relación con los .DAT
archivos, entonces un archivo de lista de directorios es la forma más eficiente de resolverlo, pero dado que ambos están en la misma ubicación, una respuesta mucho más sencilla es:
find *.DAT | while read -r f; do if [ -d "${f%.DAT}" ]; then echo "${f%.DAT}" found; else rm "$f"; fi; done
Tenga en cuenta que esto manejará nombres de archivos con espacios incrustados, algo que su solución no hace.
Para otros proyectiles se puede utilizar una técnica similar, pero no puedo hablar por ellos.