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
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
rmse 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 rmfuncionaría en GNU \ xargs. Es posible que el comando xargs de BSD y UNIX no tenga -r debe verificar suman 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 extglobes 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 rmfunciona igual de bien - @phillipsk
grep -v *.txtfuncionará solo si hay ' s exactamente un.txtarchivo. Si no hay ninguno,grepusará*.txtcomo patrón; si hay ' s más de uno, buscará el primer nombre de archivo dentro de todos los demás.txtarchivos, ignorando la salida dels. (Los resultados exactos pueden depender de las opciones globales del shell ' s.) -
.txt$coincidirá con las cadenas que terminan entxtindependientemente del punto. Porquegreptoma la expresión regular como parámetro. Por tanto, los archivosa.txtyaatxtya-txtcoincidirán con esta expresión. La expresión correcta debe serls | 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 pruebals | grep \\.txt$ | xargs --no-run-if-empty echo(nota: hay ' no-vbandera yrm=>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
-Ipodría ser útil, pero consulte por qué no analizar ls . ¿Y qué consigue| xargs? Sin ningún argumento, simplemente ejecutaechoen 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")
lsantes de intentar llamar arm.