2016-09-21 2 views
1

Моя цель - очистить каждый файл в каталоге. Я НЕ хочу фактически удалить файл, я просто хочу удалить его содержимое.Лучший способ использования символа перенаправления в сочетании с find -exec

Если вы хотите сделать это с помощью одного файла, который вы можете сделать > file.txt

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

find . -exec /bin/bash -c '> {}' \; 

Обратите внимание, как выше команда должна вызвать /bin/bash. Это потому, что просто запускать такую ​​команду, find . -exec > {} \; говорит find: invalid argument ;' to -exec' Я подозреваю, что это связано с тем, что символ перенаправления вводит в заблуждение команду.

Я хотел бы запустить эту команду без необходимости запуска /bin/bash в пределах -exec

Как это может быть сделано?

ответ

2

Один простой способ сделать это с помощью truncate:

find -type f -exec truncate -s0 {} + 

Если вы хотите использовать только Баш, вы могли бы использовать while цикл:

find -type f -print0 | 
    while IFS= read -r -d '' file; do 
     > "$file" 
    done 

Наконец, если вы Ждут» t mind, используя bash -c, было бы лучше сделать это следующим образом, чтобы избежать частого вызова bash:

find -type f -exec bash -c 'for file; do > "$file"; done' - {} + 

хотя мне это не нравится.

+0

Ницца. Первый идеальный. Что делает '-s0'? Я не мог найти никакой информации об этом. – noobcoder

+0

'-s0' означает: обрезать файл до 0 байтов. – redneb

+0

Забавно, что решение, которое вам не нравится, более идиоматично (и переносимо), чем 'find'-with-'-print0'. –

Смежные вопросы