GNU/Linux >> Tutoriales Linux >  >> Linux

¿Eliminar todos los archivos en un directorio cuyo nombre no coincide con una línea en una lista de archivos?

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.


Linux
  1. 3 formas de eliminar todos los archivos de un directorio excepto uno o algunos archivos con extensiones

  2. ¿Cómo abrir o enumerar todos los archivos cuyo nombre coincide con dos patrones en Bash?

  3. ¿Enumerar todos los directorios que no tienen un archivo con un nombre de archivo determinado dentro?

  4. Enumere recursivamente todos los archivos en un directorio, incluidos los archivos en los directorios de enlaces simbólicos

  5. Descomprimir todos los archivos en un directorio

¿Cómo eliminar todos los archivos con una extensión particular en una carpeta particular?

¿Usar Buscar para encontrar cierto directorio y eliminar todos los archivos excepto un directorio?

Eliminar un enlace simbólico a un directorio

enumerar/buscar todos los archivos normales en todos los subdirectorios, excepto los archivos binarios

¿Cómo eliminar todos los archivos en un directorio excepto algunos?

¿Cómo puedo eliminar todos los archivos de un directorio cuando informa que la lista de argumentos es demasiado larga?