
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.pdf
e 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
.pdf
nome do arquivo
Por exemplo, se houver um diretório chamado temp
na 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 .pdf
no final. -type f
seleciona apenas arquivos, não diretórios. -delete
significa 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 -name
incluirá apenas .pdf
, enquanto -iname
incluirá ambos .pdf
e.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 bash
o globbing estendido do shell, você pode remover quaisquer arquivos com extensões diferentes de .pdf
usar
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 rm
comando, resultando em um erro como
rm: cannot remove `*.!(pdf)': No such file or directory
Você pode modificar esse comportamento padrão usando a nullglob
opção shell, mas isso tem seu próprio problema. Para uma discussão mais aprofundada, consulteNullGlob - Wiki de Greg
Responder3
$ cd <the directory you want>
$ gvfs-trash !(*.pdf)
Ou via mv
comando (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