2015-06-17 7 views
4

Хороший способ очистить журналы (системный журнал имеет ручку на файл), который заморозили мой сервер Linux (из космоса) Я попытался cat /dev/null > fileABC; cat /dev/null/ > fileXYZкошка/DEV/нуль на несколько файлов, чтобы очистить существующие файлы, такие как журналы

Как я могу очистить несколько файлов cat/dev/null до нескольких файлов в эффективной или одиночной команде.

+0

'ф DEV/нуль/whatever' не имеет смысла для меня. null - это файл устройства –

+0

Сделал некоторые изменения. Я имел в виду, что это кошка. pl проверить это для очистки содержимого существующего файла http://goo.gl/UJXEy3 –

+0

@Samuel u r right. но как я могу сделать то же самое для 10-15 файлов за один раз. –

ответ

11

Жесткие кодированные решения

tee

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

Как это:

$ echo -n | tee file1 file2 file3 file4 file5 

Все файлы в этом списке будут пустыми и создано, если они не существуют.

Применительно к вашему ответу это будет:

$ cat /dev/null | tee fileABC fileXYZ 

Хотя echo -n считается лучшей практикой, чем cat /dev/null, еще лучшим решением было бы использовать printf '', как отметил Чарльз Даффи. В результате в следующей команде:

$ printf '' | tee file1 file2 file3 

truncate

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

$ truncate --size 0 file1 file2 file3 file4 file5 

, который позволяет достичь своей цели без использования труб и в одной команде, довольно изящная ответ поставляется здесь skrilled.

Структурные имена файлов решения

Если все файлы имеют структуру на их имена (например файлов) и местоположения вы можете использовать команды поиска. В следующем примере я применил стирание ко всем .java и .c исходным файлам в текущем каталоге и во всех каталогах внутри текущего каталога.

$ find . -maxdepth 2 -type f -name '*.java' -exec truncate --size 0 "{}" \; 

Разъяснение:

  • find . выполнить find в текущем каталоге .
  • -maxdepth 2 уровень рекурсии, спуск в каталоги в каталоге, но не далее (уровень 2).Установите это значение 1, чтобы не спуститься, или n, чтобы спуститься n раз.
  • -type f применяется только к файлам, а не каталоги
  • -name '*.java' применяются только к файлам, заканчивающимся в .java
  • -exec truncate --size 0 "{}" \; срезанных каждый найденный файл (имя файла хранятся в {})

См man find для больше вариантов и более подробное объяснение. Обязательно проверьте это, потому что find - один из самых мощных инструментов для автоматизации редактирования файлов.

Список файлов в отдельном файле решения

Проще всего сделать, может быть, чтобы хранить файлы, чтобы стереть в файле, строка за строкой. Если нет очевидной структуры в отношении их местоположения и имени, то есть.

Скажем, файлы хранятся в файле с именем erasure.

$ cat erasure 
fileABC 
fileXYZ 
dir/anotherFile 

В этом примере мы удалим три файла, которые перечислены выше.

$ while read file; do > "$file"; done < erasure 

Объяснение:

  • while read file для каждой строки в данном файле, сохранить строку в переменной file
  • do > "$file" пустой файл и вывода ничего в нем (т.е. удалить его)
  • done < erasure указать входной файл, используя < (перенаправление)

Примечание: в то время как этот метод сохраняет пробелы в пути, он не справляется с обратными косыми чертами и задним пробелом, как указано Charles Duffy. Одним из способов устранения обеих проблем является изменение цикла следующим образом:

while IFS= read -r file; do > "$file"; done < erasure 

Но новые строки в именах файлов по-прежнему будут проблемой. Единственный способ обойти эту проблему - отделить имена файлов, используя нулевое завершение (\0). Правильный цикл теперь становится:

while IFS= read -r -d '' file; do > "$file"; done < erasure 
+0

Спасибо. Cat/dev/null | tee fileABC fileXYZ работает, но я не понял команду echo и почему мы используем это здесь. Второй фрагмент кода хватает правильно? Я что-то упустил –

+1

Они эквивалентны, 'echo -n' - это нулевой вывод, который считается более совершенным, чем' cat/dev/null'. Не забудьте принять, если ответ помог и повысился, если вы сочтете это качественным ответом. – ShellFish

+1

@ShellFish, I ' d спорить на 'printf ''' гораздо лучше, чем 'echo -n' - см. спецификацию эхо-кода POSIX по адресу http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html и обратите внимание, что while' - n' является частью эхо BSD, его нет в спецификации SysV. –

3

Truncate можно использовать и для удаления файла.

truncate --size 0 /path/to/file/here 
+0

У меня нет усеченного на моем ящике, но я уверен ... taht будет делать, но могу ли я иметь несколько файлов, перечисленных рядом друг с другом? скажем: «truncate --size 0 log1 log2 log3? –

+1

' truncate' - действительно лучшее решение, но основная проблема заключается в обработке нескольких файлов. Хотя 'truncate' действительно поддерживает несколько файлов, его следует добавить в ответ, чтобы очистить это для OP.Так что я просто добавлю другое имя файла в команду. Отличный ответ, хотя, если мой ответ будет принят, я включу это в ответ, если с вами все в порядке (конечно, вы будете зачислены). – ShellFish

+0

Конечно, спасибо :) – skrilled

0

Вы можете сделать это довольно красиво с GNU Parallel так:

parallel '>' ::: TooLong.log BigBoy.dat NonExistant.file