¿Cómo elimino todos los archivos de una carpeta, excepto algunos archivos específicos?

11

Quiero eliminar todos los archivos en un directorio mientras dejo solo algunos archivos específicos, no tienen nada en común por su nombre. ¿Cómo podría lograr eso?

Por ejemplo, los nombres de archivo que quiero mantener son:

file_1.png` another_file.jpg`some_music.mp3

AGamePlayer
fuente

Respuestas:

14

Si estás usando bash:

shopt -s extglob
rm -- !(file1|file2|file3)

La primera línea solo activa la coincidencia de patrones extendida, y luego usamos uno de ellos:

!(pattern-list) coincide con cualquier cosa excepto uno de los patrones dados

y la lista de patrones es una lista de uno o más patrones separados por a |.


O con zsh

setopt extendedglob
rm -- ^(file1|file2)

O, más portátil, usando find:

find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +
jimmij
fuente
3
Puede ser útil incluir cómo devolver el comportamiento opcional de shell ( shopt -u extglob).
geedoubleya
7

Haga un subdirectorio tmp, mueva todos los archivos que desea mantener a ese directorio y luego haga lo siguiente rm -f *. Eso no afectará el tmpdirectorio.

Después de eso solo haz:

mv tmp/* .
rmdir tmp

(Suponiendo que ninguno de los archivos que movió comienza con un punto).

Este es uno de los pocos casos en los que tiene sentido usar el mouse y un navegador de archivos como Nautilus, donde puedes hacer Ctrlclic en los pocos archivos que deseas conservar y luego usar el menú: Edit -> Invert Selectionpara obtener los otros archivos y luego eliminarlos. .

Anthon
fuente
el movimiento de archivos al directorio tmp suena bien. De todos modos, tengo que hacer esto con la línea de comando. ¡Gracias!
AGamePlayer
3
@AwQiruiGuo El tmp tiene la ventaja de que primero separa los archivos en dos conjuntos, antes de eliminar irrevocablemente los que no desea. Entonces puede ejecutar un lspara ver si no se perdió ninguno de los archivos que desea conservar.
Anthon
2

Agregue los nombres de los archivos que desea conservar a un archivo de texto, uno por línea. Este archivo no debe estar en el directorio o también debe agregar su nombre.

Si el nombre de su directorio es foo y el nombre del archivo es bar , haga lo siguiente.

find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm

Esto hace lo siguiente:

  1. find -type fbusca los nombres de todos los archivos en foo y sus subdirectorios y los imprime en STDOUT. Con la opción -print0delimita los nombres de archivo con bytes NUL.
  2. grep -v -f barexcluye todos los nombres de archivo que coinciden con una línea en la barra . Con la opción -ztrata su entrada como un conjunto de líneas delimitadas por el byte NUL, con la opción -Zdelimita su salida con un byte NUL.
  3. xargs rmllama rmrepetidamente para eliminar los archivos. Con la opción -0, trata su entrada como un conjunto de líneas delimitadas por el byte NUL.

Esto funciona con nombres de archivos que contienen espacios en blanco.

Mathias Weidner
fuente
Esto no funcionará ya que los nombres de archivo pueden tener nuevas líneas en ellos.
Anthon
@Anthon cambió las opciones de find, grep, xargs para hacer frente a los nombres de archivo que contienen espacios en blanco, incluida la nueva línea
Mathias Weidner
Si quieres usar find, preferiría hacerlofind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
jimmij