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
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 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 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 dels
. (Los resultados exactos pueden depender de las opciones globales del shell ' s.) -
.txt$
coincidirá con las cadenas que terminan entxt
independientemente del punto. Porquegrep
toma la expresión regular como parámetro. Por tanto, los archivosa.txt
yaatxt
ya-txt
coincidirá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-v
bandera 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
-I
podría ser útil, pero consulte por qué no analizar ls . ¿Y qué consigue| xargs
? Sin ningún argumento, simplemente ejecutaecho
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")
ls
antes de intentar llamar arm
.