Eliminar todos los archivos excepto los archivos con la extensión pdf en un directorio

Eliminar todos los archivos excepto los archivos con la extensión pdf en un directorio

Tengo un directorio que contiene lo siguiente:

x.pdf
y.zip
z.mp3
a.pdf

Quiero eliminar todos los archivos excepto x.pdfy 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 .pdfnombre de archivo

Por ejemplo, si hay un directorio llamado tempen 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 .pdfal final. -type fselecciona sólo archivos, no directorios. -deletesignifica 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 -nameincluirá solo .pdf, mientras que -inameincluirá ambos .pdfy.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 bashel shell extendido de ', puede eliminar cualquier archivo con extensiones distintas a las de .pdfusar

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 rmcomando, lo que resulta en un error como

rm: cannot remove `*.!(pdf)': No such file or directory

Puede modificar este comportamiento predeterminado utilizando la nullglobopción de shell, sin embargo, eso tiene su propio problema. Para una discusión más detallada verNullGlob - Wiki de Greg

Respuesta3

Eliminar a la papelera:

$ cd <the directory you want>
$ gvfs-trash !(*.pdf)

O mediante mvun 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

información relacionada