En linux, ¿cómo eliminar todos los archivos EXCEPTO el patrón * .txt?

Sé cómo eliminar todos los archivos txt del directorio actual mediante rm *.txt. ¿Alguien sabe cómo eliminar todos los archivos en el directorio actual EXCEPTO el archivo txt?

Comentarios

  • Como siempre, pruebe las respuestas dadas con un comando inofensivo como ls antes de intentar llamar a rm.
  • ^ Esto chico no ' no le gusta vivir peligrosamente .. 🙂

Responder

Puede usar find:

find . -type f ! -name "*.txt" -delete 

O las funciones de globbing extendidas de bash:

shopt -s extglob rm *.!(txt) 

O en zsh:

setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything 

Comentarios

  • Algunos de estos pueden necesitar ser adaptados dependiendo de si tiene carpetas y lo que quiere hacer con ellas.
  • Debería ' t *.!(txt) be !(*.txt)?
  • @LauriRanta depende de lo ' s en la carpeta, que no tenemos ' t obtuve una respuesta a. ' está bien si todos los archivos tienen extensiones, y rm se ahogaría si hubiera carpetas.
  • Tengo ' un problema con los corchetes. Cuando utilizo el estilo globbing en un script bash, se queja de un error de sintaxis y los paréntesis. Sin embargo, hacerlo desde la CLI funciona.
  • @izogfif verifique que esto find . -type f ! -name "*.txt" | xargs -r rm funcionaría en GNU \ xargs. Es posible que el comando xargs de BSD y UNIX no tenga -r debe verificar su man xargs

local

Si solo desea eliminar todos los archivos excepto «* .txt», puede use el siguiente comando:

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

pero si también desea eliminar directorios junto con los archivos, entonces puede usar esto:

$ find . ! -name "*.txt" -exec rm -r {} \;

Respuesta

Hay muchas formas de hacerlo. pero la forma más sencilla sería (bash):

shopt -s extglob rm !(*.txt) 

Comentarios

  • ¿Cómo puedo usar esto para especificar múltiples extensiones?
  • shopt -s extglob es poderoso. tecmint.com/… proporciona buenos ejemplos. Para eliminar todas excepto ciertas extensiones, rm -v !(*.zip|*.odt) funciona.

Responder

Puede usar grep y xargs invertidos

ls | grep -v .txt$| xargs rm 

Comentarios

  • ls | grep -v *.txt | xargs rm funciona igual de bien
  • @phillipsk grep -v *.txt funcionará solo si hay ' s exactamente un .txt archivo. Si no hay ninguno, grep usará *.txt como patrón; si hay ' s más de uno, buscará el primer nombre de archivo dentro de todos los demás .txt archivos, ignorando la salida de ls. (Los resultados exactos pueden depender de las opciones globales del shell ' s.)
  • .txt$ coincidirá con las cadenas que terminan en txt independientemente del punto. Porque grep toma la expresión regular como parámetro. Por tanto, los archivos a.txt y aatxt y a-txt coincidirán con esta expresión. La expresión correcta debe ser ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Para personas curiosas: si quieres jugar con la expresión de forma segura, usa esta expresión de prueba ls | grep \\.txt$ | xargs --no-run-if-empty echo (nota: hay ' no -v bandera y rm=>echo). Nota 2: es posible que haya notado una doble barra invertida. Una es para regex, otra es para bash para escapar de la barra.

Responder

Una solución sin find:

mv dir/*.txt otherdir/ rm -r dir mv otherdir dir 

Esto debería funcionar en todo tipo de shells.

Respuesta

Simplemente haz:

rm $(ls -I "*.txt" ) # Elimina el tipo de archivo excepto * .txt

Del mismo modo, si necesita eliminar «excepto uno o más tipos de archivo», haga:

rm $(ls -I "*.txt" -I "*.pdf" ) # Elimina los tipos de archivos excepto * .txt & * .pdf

Comentarios

  • ¡Bienvenido a StackExchange!La opción -I podría ser útil, pero consulte por qué no analizar ls . ¿Y qué consigue | xargs? Sin ningún argumento, simplemente ejecuta echo en todas sus entradas.
  • ¿Qué se supone que debe lograr xargs?
  • Gracias, xargs no fue útil en el caso anterior, lo he corregido ahora.

Responder

Esto también funciona para eliminar todos los archivos y carpetas ocultos (dot) excepto el indicado (.mydir):

rm -rf $(ls -aI ".mydir") 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *