Eu quero remover todos os arquivos em um diretório, deixando apenas alguns arquivos especificados, eles não têm nada em comum por nome. Como eu consegui isso?
Por exemplo, os nomes de arquivo que eu quero manter são:
file_1.png
, another_file.jpg
,some_music.mp3
command-line
files
rm
AGamePlayer
fonte
fonte
shopt -u extglob
).Crie um subdiretório
tmp
, mova todos os arquivos que você deseja manter para esse diretório e façarm -f *
depois. Isso não afetará otmp
diretório.Depois disso basta fazer:
(Supondo que nenhum dos arquivos que você moveu comece com um ponto).
Este é um dos poucos casos em que faz sentido usar o mouse e um navegador de arquivos como o Nautilus, onde você pode realmente Ctrlclicar nos poucos arquivos que deseja manter e usar o menu:
Edit -> Invert Selection
para obter os outros arquivos e excluí-los .fonte
ls
para ver se não perdeu nenhum dos arquivos que deseja preservar.Adicione os nomes dos arquivos que você deseja manter em um arquivo de texto, um por linha. Este arquivo não deve estar no diretório ou você deve adicionar seu nome também.
Se o nome do seu diretório for foo e o nome do arquivo for bar , faça o seguinte.
Isso faz o seguinte:
find -type f
procura os nomes de todos os arquivos em foo e seus subdiretórios e os imprime em STDOUT. Com a opção-print0
delimita os nomes de arquivos com NUL bytes.grep -v -f bar
exclui todos os nomes de arquivos que correspondem a uma linha na barra . Com a opção-z
, trata sua entrada como um conjunto de linhas delimitadas por byte NUL, com opção-Z
delimita sua saída com um byte NUL.xargs rm
chamarm
repetidamente para excluir os arquivos. Com a opção-0
, trata sua entrada como um conjunto de linhas delimitadas por byte NUL.Isso funciona com nomes de arquivos que contêm espaço em branco.
fonte
find
Eu preferiria fazerfind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +