Exclua todos os arquivos, exceto arquivos com extensão pdf, em um diretório

Exclua todos os arquivos, exceto arquivos com extensão pdf, em um diretório

Eu tenho um diretório que contém o seguinte:

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

Quero excluir todos os arquivos, exceto x.pdfe a.pdf. Como faço isso no terminal? Não há subdiretórios, portanto não há necessidade de recursão.

Responder1

cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
  • O primeiro comando o levará ao diretório no qual deseja excluir seus arquivos
  • O segundo comando excluirá todos os arquivos, exceto aqueles que terminam com .pdfnome do arquivo

Por exemplo, se houver um diretório chamado tempna sua pasta pessoal:

cd ~/temp

em seguida, exclua os arquivos:

find . -type f ! -iname "*.pdf" -delete

Isso excluirá todos os arquivos, exceto xyz.pdf.

Você pode combinar esses dois comandos para:

find ~/temp -type f ! -iname "*.pdf" -delete

.é o diretório atual. !significa pegar todos os arquivos, exceto aqueles que estão .pdfno final. -type fseleciona apenas arquivos, não diretórios. -deletesignifica excluí-lo.

NOTA: este comando excluirá todos os arquivos (exceto arquivos PDF, mas incluindo arquivos ocultos) no diretório atual, bem como em todos os subdiretórios. !deve vir antes -name. simplesmente -nameincluirá apenas .pdf, enquanto -inameincluirá ambos .pdfe.PDF

Para excluir apenas no diretório atual e não nos subdiretórios, adicione -maxdepth 1:

find . -maxdepth 1 -type f ! -iname "*.pdf" -delete

Responder2

Com basho globbing estendido do shell, você pode remover quaisquer arquivos com extensões diferentes de .pdfusar

rm -- *.!(pdf)

Conforme observado por @pts, os --caracteres indicam o final de qualquer opção de comando, tornando o comando seguro no caso raro de arquivos cujos nomes começam com um -caractere.

Se você deseja excluir arquivos sem qualquer extensão, bem como aqueles com extensões diferentes de .pdf, então, conforme apontado por @DennisWilliamson, você pode usar

rm -- !(*.pdf)

O globbing estendido deve estar habilitado por padrão, mas caso contrário, você pode fazer isso usando

shopt -s extglob

Especialmente se você pretende usar isso dentro de um script, é importante observar que se a expressão não corresponder a nada (ou seja, se não houver arquivos não-pdf no diretório), então, por padrão, o glob será passado sem expansão para o rmcomando, resultando em um erro como

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

Você pode modificar esse comportamento padrão usando a nullglobopção shell, mas isso tem seu próprio problema. Para uma discussão mais aprofundada, consulteNullGlob - Wiki de Greg

Responder3

Excluir para a lixeira:

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

Ou via mvcomando (mas desta forma você não pode restaurá-lo da Lixeira, pois ele não registra informações .trashinfo, então isso significa que você moveu seus arquivos para umdestinoonde é o seguinte).

mv !(*.pdf) ~/.local/share/Trash/files

Responder4

Use o GLOBIGNORE do bash:

GLOBIGNORE=x.pdf:a.pdf
rm *
unset GLOBIGNORE

Na página de manual do bash:

GLOBIGNOR:

            Uma lista de padrões separados por dois pontos que definem o conjunto
            de nomes de arquivos a serem ignorados pela expansão do nome do caminho.

Um teste rápido:

mkdir /tmp/foooooo
cd /tmp/foooooo
touch x.pdf y.zip z.mp3 a.pdf
GLOBIGNORE=x.pdf:a.pdf
ls -1 *

Saída:

y.zip
z.mp3

informação relacionada