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
-execdirnos 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.