Questão Excluir todos os arquivos não jpeg


Eu tenho o exercício, no qual eu tenho que apagar todos os arquivos, que não são jpeg.

eu tentei find -type f |xargs file| grep -iv 'jpeg', mas não funciona.


2


origem


possível duplicata de Como apagar todos os arquivos em um diretório, exceto alguns? - LPChip
Aquela questão, Como apagar todos os arquivos em um diretório, exceto alguns?, discute como excluir arquivos com base no nome do arquivo. Esta questão, ao contrário, pergunta como excluir com base no tipo de arquivo como relatado pelo file comando. - John1024


Respostas:


Excluindo com base no tipo de arquivo

Para excluir todos os arquivos regulares não-JPEG no diretório atual ou em seus subdiretórios, use:

find . -type f -exec bash -c 'file -bi "$1" | grep -q image/jpeg || rm "$1"' none {} \;

Essa abordagem é segura para todos os nomes de arquivos. Ele funcionará mesmo que os nomes dos arquivos tenham novas linhas ou outros caracteres difíceis.

Como funciona

  • find . -type f

    Isso inicia um find comando, restringindo os arquivos encontrados para arquivos regulares, -type f.

  • -exec bash -c 'file -bi "$1" | grep -q image/jpeg || rm "$1"' none {} \;

    Para todos os arquivos encontrados, isso executa um comando bash para testar o tipo do arquivo. Em particular, file -bi "$1" | grep -q image/jpeg retornará verdadeiro se file relata que o arquivo tem tipo mimético image/jpeg. O operador || garante que o rm comando que segue é executado apenas para arquivos que falharam no teste jpeg. Assim, todos os arquivos não-JPEG são excluídos.

Excluindo com base no nome do arquivo

Para excluir todos os arquivos cujos nomes não terminar em .jpeg:

find . -type f ! -name '*.jpeg' -delete

Essa abordagem também é segura para todos os nomes de arquivos. Ele funcionará mesmo que os nomes dos arquivos tenham novas linhas ou outros caracteres difíceis.

Como funciona

  • find .

    Encontre todos os arquivos no diretório atual e em seus subdiretórios

  • -type f

    Restringir-nos apenas aos arquivos regulares

  • ! -name '*.jpeg'

    -name '*.jpeg' encontraria todos os arquivos cujos nomes terminam em .jpeg. O ponto de exclamação, !, no entanto, significa negação. Assim, ! -name '*.jpeg' restringe nossa busca a arquivos cujos nomes não terminar em .jpeg.

  • -delete

    Isso informa find para excluir os arquivos que correspondem aos critérios acima.

Testando

Para testar o comando, deixe o -delete:

find . -type f ! -name '*.jpeg'

Isso mostrará quais arquivos serão excluídos quando o -delete ação é usada.


6



Não não. Não há arquivos "* .jpeg", eles não têm formato no nome. Eu posso saber seu nome usando o comando 'file'. - diego9403
@adrian OK, OK. Veja a resposta atualizada. - John1024
Eu não encontrei resposta. Eu tenho que adicionar, que há um monte de pastas em pastas, por isso "ls -l" não é suficiente.Eu pensei sobre '-exec', mas aceita apenas um commant e meu favorito "|" não funciona. - diego9403
@adrian Olhe de novo: eu não usei ls -l. eu usei find que pesquisará todas as subpastas. Em segundo lugar, olhe para como eu usei -exec. o -exec comando executa um shell bash e o shell bash fuilly suporta recursos como | e ||. - John1024
Ok, mas eu tenho que saber qual é o tipo de arquivos ('jpeg'), por isso que eu deveria usar 'file', mas esse comando torna isso difícil. Depois de usar 'file', não posso usar o rm para excluir arquivos. - diego9403