2

Я пытаюсь очистить много файлов в определенной папке.

>file or cat /dev/null > file or echo "" > file может очистить файл. find . -type f -exec blahblah {} \; можно найти файлы и сделать что-нибудь на них.

Я пытался использовать оператор > в find ... -exec но результат отличается от того, что я ожидал.

Есть ли способ использовать оператор > в команде find ?

4 ответа4

4

Вы не можете использовать его напрямую, так как он будет интерпретирован как фактическое перенаправление. Вы должны обернуть вызов в другой оболочке:

find . -type f -exec sh -c 'cat /dev/null >| $0' {} \;

Если sh это Bash, вы также можете сделать:

find . -type f -exec sh -c '> $0' {} \;
2

Или вы можете перенаправить вывод команды find с подстановкой процесса:

while IFS= read -r -d '' file
do cat /dev/null > "$file"
done < <(find . type -f print0)
1

параллель позволяет экранировать > как \>:

find . -type f|parallel \>{}

Или просто используйте read:

find . -type f|while read f;do >"$f";done

Вам не нужны -r , -d '' или IFS= если только пути не содержат обратную косую черту или символы новой строки или не начинаются или не заканчиваются символами в IFS .

1

В качестве альтернативы можно просто использовать команду с соответствующим названием truncate .

Как это:

truncate -s 0 file.blob

Версия truncate GNU coreutils также обрабатывает множество интересных вещей:

РАЗМЕР также может начинаться с префикса одним из следующих модифицирующих символов: «+» удлинить на », -« уменьшить на »,« максимум »,«> минимум », /« округлить до кратного, округлить «%» до нескольких.

Еще более простой, хотя и менее уместно названный метод будет

cp /dev/null file.blob

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .