Как можно одновременно очистить файлы с одинаковыми путями?

Как можно одновременно очистить файлы с одинаковыми путями?

У меня такая структура:

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

Я хотел бы очистить схему. Я пробую:

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

но у меня такая ошибка:

-bash: */lang.log: неоднозначное перенаправление

Как мне очистить все файлы одновременно? Может быть, одной командой.

решение1

Решение POSIX, базовое:

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

… -exec true > {} \;не подойдет, нужна внутренняя оболочкаиз-за перенаправления. Обратите внимание, что часть оболочки не является sh -c 'true > {}', эта версия будетнесовершенный.


Решение POSIX должно быть быстрее благодаря созданию меньшего количества shпроцессов при наличии большого количества соответствующих файлов:

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

Если у вас есть truncate, то может принимать много операндов (примечание: truncateне требуется POSIX):

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

--здесь излишне, потому что в этом конкретном случае каждый путь, который приходит из, findдолжен начинаться с Father/, нет риска, что любой из них замаскируется под опцию. Однако в целом использование --операндов до, сгенерированных на лету, является хорошей практикой.

решение2

Это можно сделать с помощью xargs:

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

Это позволит найти все файлы с таким именем, а затем для каждого из них запустить cat /dev/null > <filename>.

Связанный контент