У меня такая структура:
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>
.