Sé cómo eliminar todos los txtarchivos en el directorio actual por rm *.txt. ¿Alguien sabe cómo eliminar todos los archivos en el directorio actual EXCEPTO txtarchivo?
Sé cómo eliminar todos los txtarchivos en el directorio actual por rm *.txt. ¿Alguien sabe cómo eliminar todos los archivos en el directorio actual EXCEPTO txtarchivo?
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)?
rmse ahogarían si hubiera carpetas.
find . -type f ! -name "*.txt" | xargs -r rmfuncionarí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 rmfunciona igual de bien
grep -v *.txtfuncionará solo si hay exactamente un .txtarchivo. Si no hay ninguno, grepse usará *.txtcomo patrón; si hay más de uno, buscará el primer nombre de archivo dentro de todos los demás .txtarchivos, ignorando la salida de ls. (Los resultados exactos pueden depender de las opciones glob de la concha.)
.txt$coincidirá con cadenas que terminan txtindependientemente del punto. Porque greptoma la expresión regular como parámetro. Por lo tanto, los archivos a.txty aatxty a-txttodos 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 -vbandera 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
-Iopción podría ser útil, pero vea por qué no analizar ls . ¿Y qué logra el | xargs? Sin ningún argumento, simplemente se ejecuta echoen toda su entrada.
xargssupone 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")
lsantes de intentar realmente llamarrm.