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 sh
processos 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 truncate
nã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 find
deve 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>
.