Tengo un directorio con más de 1000 archivos. En un archivo de texto, tengo unos 50 nombres de archivo, uno por línea. Me gustaría eliminar todos los archivos del directorio cuyos nombres de archivo no se correspondan con una entrada de la lista. ¿Cuál es la mejor manera de hacer esto? Inicié un script de shell, pero no pude determinar el comando adecuado para determinar si el nombre de archivo está en la lista. Gracias.
Respuesta aceptada:
Me doy cuenta de que cualquier pregunta sobre cómo eliminar archivos debe tomarse con mucho cuidado.
Mi primera respuesta fue demasiado apresurada. No tomé el hecho de que la lista de archivos podría tener un formato incorrecto para usarse con egrep. Edité la respuesta para reducir ese riesgo.
Eso debería funcionar para los archivos que no tienen espacio en el nombre:
Primero reconstruya su lista de archivos para asegurarse de que coincida con el nombre de archivo exacto:
sed -e 's,^,^,' -e 's,$,$,' filelist > newfilelist
construye los comandos rm
cd your_directory
ls | egrep -vf newfilelist | xargs -n 1 echo rm > rmscript
Compruebe si el script rm le conviene (puede hacerlo con "vim" o "less").
Luego realice la acción:
sh -x rmscript
Si los archivos tienen espacios en su nombre (si los archivos tienen el "
en el nombre, entonces esto no funcionará):
ls | egrep -vf newfilelist | sed 's,^(.*)$,rm "1",' > rmscript
¡por supuesto, la lista de archivos no debe estar en el mismo directorio!
EDITADO:
La lista de archivos de Nathan contenía nombres que coincidían con todos los archivos del directorio (como "html" coincide con "bob.html"). Entonces no se eliminó nada porque egrep -vf
absorbió toda la corriente. Agregué un comando para poner un "^" y un "$" alrededor de cada nombre de archivo. Aquí tuve suerte de que la lista de archivos de Nathan fuera correcta. Si hubiera sido formateado en DOS con líneas terminadas en CR-LF o con espacios adicionales, el egrep no habría conservado ningún archivo y todo habría sido eliminado.