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 estar mal formada 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 exacto del archivo:
sed -e 's,^,^,' -e 's,$,$,' filelist > newfilelist
construir 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 realiza la acción:
sh -x rmscript
Si los archivos tienen espacios en su nombre (si los archivos tienen "
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 transmisión. Agregué un comando para poner un "^" y un "$" alrededor de cada nombre de archivo. Tuve la suerte de que la lista de archivos de Nathan era correcta. Si hubiera sido formateado con DOS con líneas terminadas CR-LF o con espacios adicionales, egrep no habría preservado ningún archivo y todos se habrían eliminado.
ls
proporciona los nombres de archivo de directorio,egrep -vf filelist
filtre sus 50 nombres de archivo. Me temo que borraste todos tus archivos.Preconstruir los argumentos para
find
:Usa las
echo
partes para ver qué se construiría. Retire lasecho
partes para ejecutarlo realmente.Actualización: Demostración:
fuente
'
deberían agregarse algunas comillas simples ( ), es decir,keep=( -name \'"$REPLY"\' )
ykeep+=( -o -name \'"$REPLY"\' )
.Con
zsh
:Lee las líneas de
filelist
una matriz y luego usa calificadores /e
cadena glob para glob / seleccionar solo los nombres de archivo que no están presentes en la matriz:.
selecciona solo archivos regulares (agregueD
si su lista contiene archivos de puntos) y los negados^e_'expression'_
seleccionan solo aquellos para que la expresión devuelve falso, es decir, si su nombre ($REPLY
) no es un elemento de la matriz .Si está satisfecho con el resultado, reemplace
print -rl
conrm
para eliminar realmente los archivos:Para seleccionar y eliminar archivos de forma recursiva, use el modificador
*/**
glob con${REPLY:t}
glob:fuente
Si coloca el contenido del directorio en un archivo así:
Abra la lista de archivos con un editor de texto y elimine todos los archivos, excepto los que DESEA ELIMINAR . Eso está en negrita porque es el enfoque opuesto a la respuesta anterior
Prueba esto:
Si ve su lista de salida de archivos a la pantalla, reemplace echo con
rm -v
, así:fuente
Ejecute el siguiente script.
all_files
.not_to_be_deleted_files
).not_to_be_deleted_files
yfiles_to_be_deleted
al final de,not_to_be_deleted_files
ya que necesitamos estos 2 archivos.join
comando de Linux y redirigiendo la salida alfiles_to_be_deleted
archivo.files_to_be_deleted
y eliminando los archivos mencionados en ese nombre de archivo.El guión es el siguiente.
PD : Probablemente, si deseas que esto se guarde como un script y lo ejecutes, también puedes agregar el nombre del script usando
echo scriptname >> not_to_be_deleted_files
.Aunque no es obligatorio, prefiero hacerlo porque no habrá arrepentimientos más adelante. Probé un pequeño conjunto de archivos y funcionó en mi sistema. Sin embargo, si quiere estar seguro, intente
test
primero en un directorio y luego elimine los archivos en el directorio original.fuente
fuente
¡Fui por un enfoque más seguro y mucho más rápido porque tenía 18,000 archivos en la lista! Necesitaba limpiar imágenes en una gran instalación de Drupal.
Eliminar todos los archivos que no están en la lista es lo mismo que conservar solo los que están en la lista. Así que decidí copiar los archivos de la lista a otra ubicación, pero copiar 20 GB de archivos ocuparía demasiado espacio y también sería muy lento. Entonces, el truco es copiar los archivos como
hardlinks
, en su lugar, usando la-l
opción decp
. Esto casi no ocupa espacio y es muy rápido. Además, como necesitaba preservar la estructura del directorio, utilicé la--parents
opción.Aquí hay un extracto de mi lista de archivos:
Entonces, una línea de ejemplo sería, con temp como destino:
Esto creará esta estructura:
Tenga en cuenta que el destino debe estar en el mismo sistema de archivos que la fuente para que funcionen los enlaces duros.
El siguiente paso es construir el script:
Ahora, suponiendo que ya haya creado el directorio vacío / some / where / temp, puede copiar los archivos de esta manera:
Tenga en cuenta cómo terminan los errores
missing_files
. ¡La ventaja adicional de este enfoque es que obtendrá una lista de archivos de la lista original que en realidad no existen!Después de ejecutar el script, temp contendrá solo aquellos archivos que están en la lista de archivos, pero sin eliminar nada y sin ocupar espacio adicional. Si está satisfecho con el resultado, puede eliminar todos los archivos originales, incluidas las subcarpetas.
Finalmente, mueva los archivos y carpetas de temp nuevamente a la ubicación original.
Para los 18,000 archivos, solo tomó unos segundos.
fuente
Seguro, simple.
cd
al directorioCrea un directorio temporal.
hecho.
fuente