Como posso esvaziar arquivos ao mesmo tempo com os mesmos caminhos?

Como posso esvaziar arquivos ao mesmo tempo com os mesmos caminhos?

Eu tenho uma estrutura assim:

Father:
├───Charlie
│    └───lang.log
├───Ava
│    └───lang.log
├───Sophia
│    └───lang.log
...

Eu gostaria de limpar o esquema. Eu tento:

cat /dev/null > Father/*/lang.log

mas estou com esse erro:

-bash: */lang.log: redirecionamento ambíguo

Como posso esvaziar todos os arquivos ao mesmo tempo? Talvez com um único comando.

Responder1

Solução POSIX, básica:

find Father/ -type f -name lang.log -exec sh -c 'true > "$1"' sh {} \;

… -exec true > {} \;não funcionaria, o invólucro interno é necessáriopor causa do redirecionamento. Observe que a parte do shell não é sh -c 'true > {}', esta versão seriafalho.


Solução POSIX, deve ser mais rápida graças à geração de menos shprocessos se houver muitos arquivos correspondentes:

find Father/ -type f -name lang.log -exec sh -c 'for f; do true > "$f"; done' sh {} +

Se você tiver truncate, isso pode levar muitos operandos (a nota truncatenão é exigida pelo POSIX):

find Father/ -type f -name lang.log -exec truncate -s 0 -- {} +

--é excessivo aqui porque neste caso específico todo caminho que vem finddeve começar com Father/, não há risco de algum deles se disfarçar como uma opção. Em geral, porém, usar --operandos before gerados dinamicamente é uma boa prática.

Responder2

Uma maneira de fazer isso é usando xargs:

find . -name lang.log | xargs -I {} sh -c "cat /dev/null > {}"

Isso encontrará qualquer arquivo com esse nome e, para cada um deles, execute cat /dev/null > <filename>.

informação relacionada