Eu queria excluir todas as extensões .sh, o que fiz:
ls *.sh | xargs -I {} mv {} `basename {} .sh`
No entanto, ele não funciona, ele se comporta como basename
retorna o nome do arquivo inalterado.
Por que está se comportando dessa maneira?
Por exemplo, isso funciona:
ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`;
EDIT :
Solução: aspas simples impedem a `basename ...`
avaliação pelo shell antes da execução do comando.
ls *.sh | xargs -I {} sh -c 'mv {} `basename {} .sh`'
bash
text-processing
xargs
majkinetor
fonte
fonte
-i
opção, mas essas opções 'clássicas' foram preteridas. Por exemplo, para usar apenas uma opção / linha, a nova página do manual POSIX recomenda-L1
. Para chamar o comportamento antigo de-i
, a página recomenda a-I'{}'
opção.rename
, por exemplo:rename 's/\.sh//' *.sh
. Tente primeiro com o dry-run (-n
).rename
funciona muito bem e é bastante simples, mas lembre-se de que é muito específico para a distribuição. As distribuições baseadas em RHEL e Debian fornecemrename
comandos diferentes , portanto, é preciso ter isso em mente ao criar scripts de distribuição cruzada.Não tenho certeza sobre sua pergunta, você está realmente perguntando por que sua primeira linha não funciona? Ou você está procurando um método adequado para renomear todos os arquivos .sh?
Supondo que seja o método mais limpo, prefiro preparar as opções de comando antes
xargs
. Para remover uma extensão de arquivo .sh, costumo considerar essa abordagem,fonte