Excluindo as listagens filtradas durante a produção de uma saída

5

Eu tenho um diretório com várias extensões de arquivos misturadas e gostaria de listar uma extensão de arquivo específica (talvez algo como grep *.mp3 ) e, ao listar, excluí-las com uma saída. Como posso fazer isso ou se houver um dupe, por favor, sinta-se livre para me marcar.

Exemplo:

grep "*.mp3" . | rm -fr 
    
por AzkerM 24.09.2016 / 07:40

3 respostas

5

Vamos começar com um diretório com três mp3 arquivos:

$ ls *mp3
a.mp3  b.mp3  c.mp3

Agora, vamos excluí-los depois de listarmos o que estamos excluindo:

$ find . -maxdepth 1 -name '*.mp3' -printf 'Deleting %p\n' -delete
Deleting ./a.mp3
Deleting ./b.mp3
Deleting ./c.mp3

Depois disso, os arquivos mp3 sumiram:

$ ls *mp3
ls: cannot access '*mp3': No such file or directory

Como funciona

  • 'encontrar.

    Isso inicia um comando find . Ele procurará arquivos no diretório atual, . .

  • -maxdepth 1

    Por padrão, find recursivamente pesquisa os subdiretórios. Isso diz para não fazer isso. Com -maxdepth 1 , o comando find irá apenas olhar para o que encontrar no diretório atual e não explorar nenhum dos subdiretórios do diretório atual.

  • -name '*.mp3'

    Isso diz ao find para procurar apenas por arquivos com a extensão .mp3 .

  • -printf 'Deleting %p\n'

    Isto diz ao find para imprimir uma mensagem sobre cada arquivo encontrado.

    Você pode, claro, mudar isso para outra mensagem, se quiser. Se você não quiser uma mensagem, esta opção pode ser totalmente omitida.

  • -delete

    Isso diz para localizar para excluir cada arquivo.

Pesquisa insensível a maiúsculas

Se você também quiser encontrar arquivos com o nome .MP3 ou .Mp3 etc., precisaremos de uma pesquisa sem distinção entre maiúsculas e minúsculas e usaremos -iname :

find . -maxdepth 1 -iname '*.mp3' -printf 'Deleting %p\n' -delete
    
por John1024 24.09.2016 / 07:47
4

Você quer find ...

find . -type f -iname "*.mp3"

Por padrão, ele recorre aos subdiretórios, portanto, se você estiver obtendo mais arquivos do que deseja, adicione -maxdepth 1 para pesquisar apenas no diretório atual. Depois de verificar que a saída é o que você deseja excluir, você pode fazê-lo novamente (obrigado seta para cima ...) e adicionar -delete .

find . -type f -iname "*.mp3" -delete

. é o diretório de trabalho atual - você pode dar o caminho para o diretório aqui se você não estiver nele ...

Para torná-lo interativo, você pode usar -exec para definir sua própria ação em vez de find ' -delete action

find . -type f -iname "*.mp3" -exec rm -i -- {} \;

Em seguida, ele perguntará a você antes de excluir cada arquivo ...

    
por Zanna 24.09.2016 / 07:48
3

Quando você deseja excluir apenas itens no diretório atual, é suficiente usar o caractere curinga da seguinte forma:

$ ls *.jpeg
birthday2016_001.jpeg  birthday2016_002.jpeg  birthday2016_003.jpeg
$ rm *.jpeg
$ ls *.jpeg
ls: cannot access '*.jpeg': No such file or directory

Como você pode ver, no exemplo acima, todos os arquivos com extensão .jpeg foram removidos. Listá-los é a mesma ideia - echo *.jpeg e ls *.jpeg . Então você basicamente poderia fazer simplesmente ls *.mp3 && rm *.mp3 para o seu caso

Alternativa em Python:

No meu caso, eu estava removendo o arquivo .jpeg , então ajuste o código abaixo conforme necessário:

 python -c 'import os,sys;[(sys.stdout.write(i + "\n"),os.unlink(i)) for i in os.listdir(".")  if i.endswith(".jpeg")]'

Execução da amostra:

$ ls *.jpeg
birthday2016_001.jpeg  birthday2016_002.jpeg  birthday2016_003.jpeg     
$ python -c 'import os,sys;[(sys.stdout.write(i + "\n"),os.unlink(i)) for i in os.listdir(".")  if i.endswith(".jpeg")]'
birthday2016_003.jpeg
birthday2016_001.jpeg
birthday2016_002.jpeg
$ ls *.jpeg
ls: cannot access '*.jpeg': No such file or directory
    
por Sergiy Kolodyazhnyy 24.09.2016 / 19:45