A solução é bem fácil. Se você quiser fazer isso para cada arquivo, use recursivamente find
. Ele listará todos os arquivos e diretórios, descendo também em subdiretórios.
find . -type f -execdir zip '{}.zip' '{}' \;
Explicação:
- O primeiro argumento é o diretório no qual você deseja iniciar,
.
- Em seguida, vamos restringi-lo para encontrar apenas os arquivos (
-type f
) - A opção
-execdir
nos permite executar um comando em cada arquivo encontrado, executando-o a partir do diretório do arquivo - Esse comando é avaliado como
zip file.txt.zip file.txt
, por exemplo, pois todas as ocorrências de{}
são substituídas pelo nome real do arquivo. Este comando precisa ser finalizado com\;
Claro, find
tem mais opções. Se, em vez disso, você quiser apenas permanecer em seu diretório atual, não descer em subdiretórios:
find . -type f -maxdepth 1 -execdir zip '{}.zip' '{}' \;
Se você quiser restringi-lo a determinados tipos de arquivo, use a opção -name
(ou -iname
para correspondência que não diferencia maiúsculas de minúsculas):
find . -type f -name "*.txt" …
Qualquer outra coisa (incluindo o loop com for
sobre a saída de ls *
) é uma sintaxe bastante desagradável na minha opinião e é provável que quebre, por exemplo em arquivos com espaços em seu nome ou devido a muitos argumentos.