![Eliminar todos los archivos excepto los archivos con la extensión pdf en un directorio](https://rvso.com/image/977075/Eliminar%20todos%20los%20archivos%20excepto%20los%20archivos%20con%20la%20extensi%C3%B3n%20pdf%20en%20un%20directorio.png)
Tengo un directorio que contiene lo siguiente:
x.pdf
y.zip
z.mp3
a.pdf
Quiero eliminar todos los archivos excepto x.pdf
y a.pdf
. ¿Cómo hago esto desde la terminal? No hay subdirectorios, por lo que no es necesario recurrir a ninguna recursividad.
Respuesta1
cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
- El primer comando lo llevará al directorio en el que desea eliminar sus archivos.
- El segundo comando eliminará todos los archivos excepto aquellos que terminan en
.pdf
nombre de archivo
Por ejemplo, si hay un directorio llamado temp
en su carpeta de inicio:
cd ~/temp
luego borre los archivos:
find . -type f ! -iname "*.pdf" -delete
Esto eliminará todos los archivos excepto xyz.pdf
.
Puede combinar estos dos comandos para:
find ~/temp -type f ! -iname "*.pdf" -delete
.
es el directorio actual. !
significa tomar todos los archivos excepto los que están .pdf
al final. -type f
selecciona sólo archivos, no directorios. -delete
significa eliminarlo.
NOTA: este comando eliminará todos los archivos (excepto los archivos pdf pero incluidos los archivos ocultos) en el directorio actual, así como en todos los subdirectorios. !
debe venir antes -name
. simplemente -name
incluirá solo .pdf
, mientras que -iname
incluirá ambos .pdf
y.PDF
Para eliminar solo en el directorio actual y no en los subdirectorios, agregue -maxdepth 1
:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
Respuesta2
Con bash
el shell extendido de ', puede eliminar cualquier archivo con extensiones distintas a las de .pdf
usar
rm -- *.!(pdf)
Como señaló @pts, los --
caracteres indican el final de cualquier opción de comando, lo que hace que el comando sea seguro en el raro caso de archivos cuyos nombres comiencen con un -
carácter.
Si desea eliminar archivos sin ninguna extensión, así como aquellos con extensiones distintas a .pdf
, entonces, como lo señaló @DennisWilliamson, puede usar
rm -- !(*.pdf)
La globbing extendida debería estar habilitada de forma predeterminada, pero si no, puedes hacerlo usando
shopt -s extglob
Especialmente si tiene la intención de usar esto dentro de un script, es importante tener en cuenta que si la expresión no coincide con nada (es decir, si no hay archivos que no sean PDF en el directorio), entonces, de forma predeterminada, el globo se pasará sin expandir al rm
comando, lo que resulta en un error como
rm: cannot remove `*.!(pdf)': No such file or directory
Puede modificar este comportamiento predeterminado utilizando la nullglob
opción de shell, sin embargo, eso tiene su propio problema. Para una discusión más detallada verNullGlob - Wiki de Greg
Respuesta3
$ cd <the directory you want>
$ gvfs-trash !(*.pdf)
O mediante mv
un comando (pero de esta manera no puedes restaurarlo desde la Papelera ya que no registra información .trashinfo, por lo que esto significa que moviste tus archivos a unadestinodonde es el siguiente).
mv !(*.pdf) ~/.local/share/Trash/files
Respuesta4
Utilice GLOBIGNORE de bash:
GLOBIGNORE=x.pdf:a.pdf
rm *
unset GLOBIGNORE
Desde la página de manual de bash:
GLOBIGNORAR: Una lista de patrones separados por dos puntos que definen el conjunto de nombres de archivos que serán ignorados por la expansión del nombre de ruta.
Una prueba rápida:
mkdir /tmp/foooooo
cd /tmp/foooooo
touch x.pdf y.zip z.mp3 a.pdf
GLOBIGNORE=x.pdf:a.pdf
ls -1 *
Producción:
y.zip z.mp3