¿Cómo puedo vaciar archivos al mismo tiempo con las mismas rutas?

¿Cómo puedo vaciar archivos al mismo tiempo con las mismas rutas?

Tengo una estructura como esta:

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

Me gustaría limpiar el esquema. Lo intento:

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

pero tengo este error:

-bash: */lang.log: redirección ambigua

¿Cómo puedo vaciar todos los archivos al mismo tiempo? Quizás con un solo comando.

Respuesta1

Solución POSIX, básica:

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

… -exec true > {} \;no funcionaría, se necesita la carcasa interiordebido a la redirección. Tenga en cuenta que la parte del caparazón no lo es sh -c 'true > {}', esta versión seríadefectuoso.


Solución POSIX, debería ser más rápida gracias a que genera menos shprocesos si hay muchos archivos coincidentes:

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

Si tiene truncateeso, puede tomar muchos operandos ( truncatePOSIX no requiere nota):

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

--Es excesivo aquí porque en este caso particular cada camino que proviene finddebe comenzar con Father/, no hay riesgo de que alguno de ellos se disfrace como una opción. Sin embargo, en general, --es una buena práctica utilizar operandos anteriores generados sobre la marcha.

Respuesta2

Una forma de hacerlo es usando xargs:

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

Eso encontrará cualquier archivo con ese nombre y luego ejecutará para cada uno de ellos cat /dev/null > <filename>.

información relacionada