Sé cómo eliminar todos los txt
archivos en el directorio actual por rm *.txt
. ¿Alguien sabe cómo eliminar todos los archivos en el directorio actual EXCEPTO txt
archivo?
Sé cómo eliminar todos los txt
archivos en el directorio actual por rm *.txt
. ¿Alguien sabe cómo eliminar todos los archivos en el directorio actual EXCEPTO txt
archivo?
Respuestas:
Puedes usar find
:
find . -type f ! -name '*.txt' -delete
O las características 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
*.!(txt)
ser !(*.txt)
?
rm
se ahogarían si hubiera carpetas.
find . -type f ! -name "*.txt" | xargs -r rm
funcionaría en GNU \ xargs. El comando xargs BSD y UNIX puede no tener -r usted debe verificar su localman xargs
Si solo desea eliminar todos los archivos excepto '* .txt', puede usar el siguiente comando:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
pero si también desea eliminar directorios junto con los archivos, puede usar esto:
$ find . ! -name "*.txt" -exec rm -r {} \;
Puedes usar grep invertido y xargs
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rm
funciona igual de bien
grep -v *.txt
funcionará solo si hay exactamente un .txt
archivo. Si no hay ninguno, grep
se usará *.txt
como patrón; si hay 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 glob de la concha.)
.txt$
coincidirá con cadenas que terminan txt
independientemente del punto. Porque grep
toma la expresión regular como parámetro. Por lo tanto, los archivos a.txt
y aatxt
y a-txt
todos 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, utiliza esta expresión de prueba ls | grep \\.txt$ | xargs --no-run-if-empty echo
(nota: no hay -v
bandera y rm=>echo
). Nota 2: es posible que haya notado una doble barra invertida. Uno es para expresiones regulares, otro es para bash para escapar de la barra oblicua.
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 lo siguiente:
rm $(ls -I "*.txt" -I "*.pdf" )
# Elimina tipos de archivos excepto * .txt y * .pdf
-I
opción podría ser útil, pero vea por qué no analizar ls . ¿Y qué logra el | xargs
? Sin ningún argumento, simplemente se ejecuta echo
en toda su entrada.
xargs
supone que debe lograr?
Esto también funciona para eliminar todos los archivos y carpetas ocultos (punto) excepto el indicado ( .mydir
):
rm -rf $(ls -aI ".mydir")
ls
antes de intentar realmente llamarrm
.