Estou tentando zerar (truncar) todos os arquivos em uma pasta ou subárvore que correspondem a um curinga. Outro post recomendou o uso do find … -exec
método over , que recebeu críticas elevadas. Quando tentei o método, no entanto, não consegui fazê-lo funcionar em arquivos com espaços em seus nomes.for variable in wildcard
find … -exec
Dois métodos tentados:
for
método (obras):
for x in *.wav; do echo -n "" > "$x"; done
find
método (precisa de ajuda):
find . -type f -iname \*.wav -exec > "{}" \;
que produz
find: invalid argument `;' to `-exec'
e cria um arquivo chamado {}
de zero bytes.
Observe que a substituição > "{}"
por echo {}
imprime a lista de arquivos na pasta, portanto a sintaxe está próxima. Só preciso descobrir como atenuar o erro com nomes de arquivos espaçados.
-exec > {}
não funciona, nunca , ponto final. Isso não tem nada a ver com espaços nos nomes de arquivos.Respostas:
O problema com seu
find
comando é que ele espera-exec
manipular a>
, masfind … -exec
manipula apenas comandos simples. Somente o shell sabe como interpretar>
. (OK, pode haver um ou dois outros programas que podem fazê-lo, masfind
não é um deles.)Se você quiser algo próximo do que tem, use
em que você diz
find
para executar um shell, e você usa-c
para dizer ao shell para executar um c ommand que consiste em>
seguido pelo nome do arquivo. Eu recomendaria que você fizesse algo mais simples:fonte
for x in `find . -name "*.wav"`
é o tipo de coisa que você realmente precisa evitar.for x in *.wav
não é tão ruim.Você não precisa citar a
{}
construção emfind -exec
:Você não pode usar
>
emfind -exec
, ele só quer um comando e parâmetros. Crie um script para chamar,find -exec
se você precisar.fonte
-exec > {}
retornafind: invalid argument `;' to -exec'
e cria um arquivo vazio{}
. A opção é criar um scripttruncate.sh
que faça o que você deseja"$1"
e depois chamá-lo-exec
.-exec > {}
não funciona, nunca , ponto final. Isso não tem nada a ver com espaços nos nomes de arquivos.