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 sh
procesos si hay muchos archivos coincidentes:
find Father/ -type f -name lang.log -exec sh -c 'for f; do true > "$f"; done' sh {} +
Si tiene truncate
eso, puede tomar muchos operandos ( truncate
POSIX 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 find
debe 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>
.