Насправді друга форма touch filenameнічого не видаляє з файлу - вона створює лише порожній файл, якщо такого не існувало, або оновлює останню змінену дату існуючого файлу.
І третя filename < /dev/nullнамагається запустити ім'я файлу з /dev/nullвведенням.
cp /dev/null filename працює.
Щодо ефективного, найефективнішим було б truncate -s 0 filename; дивіться тут: http://linux.die.net/man/1/truncate .
В іншому випадку cp /dev/null filenameабо > filenameобидва штрафу. Вони обидва відкривають, а потім закривають файл, використовуючи налаштування усікання-відкривання. cpтакож відкривається /dev/null, так що робить це незначно повільніше.
З іншого боку, truncateце, швидше за все, буде повільніше, ніж > filenameпри запуску зі скрипту, оскільки виконання команди усікання вимагає від системи відкрити виконуваний файл, завантажити його та запустити його.
truncate -s 0 filename?