Linux удалить файлы нулевого размера

5 способов очистить или удалить содержимое большого файла в Linux

Иногда при работе с файлами в терминале Linux вам может понадобиться очистить содержимое файла, не обязательно открывая его с помощью каких-либо редакторов командной строки Linux. Как этого добиться? В этой статье мы рассмотрим несколько различных способов очистки содержимого файла с помощью некоторых полезных команд.

Внимание: прежде чем мы перейдем к рассмотрению различных способов, обратите внимание, что, поскольку в Linux все является файлом, вы всегда должны убедиться, что файл(ы) вы очищаете не важные пользовательские или системные файлы. Очистка содержимого критической системы или файла конфигурации может привести к фатальной ошибке или сбою приложения/системы.

С учетом сказанного ниже приведены способы очистки содержимого файла из командной строки.

Важно. В целях этой статьи мы использовали файл access.log в следующих примерах.

1. Пустое содержимое файла путем перенаправления на Null

Самый простой способ очистить содержимое файла с помощью перенаправления оболочки null (несуществующий объект) в файл, как показано ниже:

2. Пустой файл с использованием «настоящего» перенаправления команд

Здесь мы будем использовать символ : — это встроенная команда оболочки, которая по сути эквивалентна команде true и может использоваться как неоперативная (без операции) .

Другой способ — перенаправить вывод встроенной команды : или true в файл следующим образом:

# : > access.log OR # true > access.log

3. Пустой файл с помощью утилиты cat/cp/dd с /dev/null

В Linux устройство null в основном используется для отбрасывания нежелательных выходных потоков процесса или в качестве подходящего пустого файла для входных потоков. Обычно это делается с помощью механизма перенаправления.

Таким образом, файл устройства /dev/null является специальным файлом, который списывает (удаляет) любой отправленный ему ввод или его вывод такой же, как у пустого файла.

Кроме того, вы можете очистить содержимое файла, перенаправив вывод /dev/null в него (файл) в качестве ввода с помощью команды cat:

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

В следующей команде if означает входной файл, а of — выходной файл.

4. Очистить файл с помощью команды echo

Здесь вы можете использовать команду echo с пустой строкой и перенаправить ее в файл следующим образом:

# echo "" > access.log OR # echo > access.log

Примечание. Следует помнить, что пустая строка не равно нулю. Строка уже является объектом, поскольку она может быть пустой, а нуль просто означает отсутствие объекта.

По этой причине, когда вы перенаправляете команду out of the cat, печатается пустая строка (пустая строка).

Чтобы отправить вывод null в файл, используйте флаг -n , который указывает echo не выводить завершающую новую строку, которая ведет к пустой строке, созданной в предыдущей команде.

Читайте также:  Hot to install linux

5. Очистить файл с помощью команды truncate

Команда truncate помогает уменьшить или увеличить размер файла до определенного размера.

Вы можете использовать его с опцией -s , которая определяет размер файла. Чтобы очистить содержимое файла, используйте размер 0 (ноль), как в следующей команде:

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

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

Источник

Linux удалить файл размером 0

Как удалить определенный файл в Linux, если его размер равен 0. Я хочу выполнить это в crontab без каких-либо дополнительных script.

l filename.file | grep 5th-tab | not eq 0 | rm 

Это приведет к удалению всех файлов в каталоге (и ниже), размер которого равен нулю.

find /tmp -size 0 -print0 |xargs -0 rm 

Если вам нужен конкретный файл,

if [ ! -s /tmp/foo ] ; then rm /tmp/foo fi 

Поиск и удаление пустых файлов в текущем каталоге и подкаталогах:

find . -type f -empty -delete 

-type f необходимо, так как также каталоги отмечены как нулевые.

Точка . (текущий каталог) – это начальный каталог поиска. Если у вас есть поиск GNU (например, не Mac OS), вы можете опустить его в этом случае:

Если файлы для поиска не указаны, используется текущий каталог (.).

Для этого вы можете использовать команду find . Мы можем сопоставлять файлы с помощью -type f и сопоставлять пустые файлы с помощью -size 0 . Затем мы можем удалить совпадения с помощью -delete .

find . -type f -size 0 -delete 

Это работает для простой BSD, поэтому он должен быть универсально совместим со всеми вкусами. Ниже, например, в pwd ( . )

В Linux команда stat (1) полезна, когда вам не нужно найти (1):

(( $(stat -c %s "$filename") )) || rm "$filename" 

Команда stat здесь позволяет нам просто получить размер файла, что -c %s (см. man-страницы для других форматов). Я запускаю программу stat и фиксирую ее вывод, что $( ) . Этот результат показан численно, что внешний (( )) . Если для размера указан ноль, то это FALSE, поэтому выполняется вторая часть OR. Без нуля (непустой файл) будет TRUE, поэтому rm не будет выполнен.

Для нерекурсивного удаления (с использованием du и awk):

find . -type f -empty -exec rm -f <> \; 

Источник

Удаление файлов нулевого размера 0

kir202 написал 5 октября 2006 года в 20:13 (8793 просмотра) Ведет себя неопределенно; открыл 2 темы в форуме, оставил 7 комментариев на сайте.

Как можно сделать так, чтобы удалить файлы в указанной папке и подпапках с размером = 0.

find "/путь/до/указанной/папки" -size 0 -type f -exec rm -f <> +

find /path/to/dir -type f -size 0 -delete

myst
find /path/to/dir -type f -size 0 -delete

fly4life, четай man find :))

В man’е есть такая секция ‘EXAMPLES’, посмотри, как там предлагается удалять найденные файлы 😉

Читайте также:  Установка драйвера wifi адаптера linux

Хотя, твой вариант с ‘-delete’ мне тоже нравится больше.

Спасибо за варианты, сделал так как «myst» написал.

Еще нужно сделать так, чтобы имена файлов которые удаляются записывались в какой-нибудь файл например log.txt и внем писалось: файл «имя файла» удален из «путь где находился».

find /path/to/dir -type f -size 0 -delete -print | sed -r ’s~(.*)/(.*?)~Файл «\2» удалён из «\1»~’ > /peth/to/rm_0_files.log

Genie
find /path/to/dir -type f -size 0 -delete -print | sed -r ’s~(.*)/(.*?)~Файл «\2» удалён из «\1»~’ > /peth/to/rm_0_files.log

В коде ругается на «sed: illegal option —r» и создаёт файл, но он пустой.

find "/путь/до/указанной/папки" -size 0 -type f -print -delete | awk '' > removed_files.txt
perl -MFile::Find::Rule -e 'foreach(File::Find::Rule->file->size(0)->in("/dir"))'> removed_files.txt
find "/путь/до/указанной/папки" -size 0 -type f -print -delete | awk '' > removed_files.txt

Всё работает, но происходит интересное файл removed_files.txt создается не всегда с первого раза, вчём может быть причина? или это у меня какой-то косяк?

kir202
Всё работает, но происходит интересное файл removed_files.txt создается не всегда с первого раза, вчём может быть причина? или это у меня какой-то косяк?

А тебе надо, чтобы список дописывался в существующий файл? Тогда вместо ‘>’ надо писать ‘>>’.

Ну и рекомендуется к прочтению:

ну дык надо писать не —r, а -r. в ман бы заглянул для разнообразия.

и где это в моём коде ты нашёл «—r»?

Это не в коде «—r» это пишется после выполнения.

Читай «man sed». Надо писать не —r, а -r (перед r ОДНО тире)

Всё разобрался сделал по примеру «fly4life». Спасибо всем за советы.

Воблин. Хоть бы кто попробовал. Например:

Надеюсь, намёк не придётся объяснять по слогам ;).

гы. а нефиг пользоваться не-GNU sed-ом… ;))))

  • REDkiy, 8 июня в 9:09 → Как «замокать» файл для юниттеста в Python?2
  • REDkiy, 8 июня в 8:58 → Перекличка15
  • fhunter, 29 ноября в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt?6
  • Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание1
  • Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON1

При полном или частичном использовании любых материалов с сайта вы обязаны явным образом указывать гиперссылку на сайт www.nixp.ru в качестве источника.

  • Разработано в компании
  • Идея и поддержка проекта — Дмитрий Шурупов

Источник

How to delete many 0 byte files in linux?

I’ve a directory with many number of 0 byte files in it. I can’t even see the files when I use the ls command. I’m using a small script to delete these files but sometimes that does not even delete these files. Here is the script:

i=100 while [ $i -le 999 ];do rm -f file$*; let i++; done 

I know because I was able to see them a few times, this 0 byte files occured several times and i don’t know when and how but sometimes i could see them sometimes as now i could not see them. However i know the reason of the problem and it occured again, therefore i know they are in that directory

10 Answers 10

Use find combined with xargs .

find . -name 'file*' -size 0 -print0 | xargs -0 rm 

You avoid to start rm for every file.

-exec will start a new process with each argument. xargs won’t. This is a great improvement in the number of process to start, and a great improvement in execution time. See man xargs for more info.

@tumtumtum It is true that -size 0c would be more correct (no unit specified default to number of blocks), but you’re wrong in stating that -size 0 will include files less than 512 bytes. Indeed, as soon as a file is 1 byte in size, it occupies 1 block.

With GNU’s find (see comments), there is no need to use xargs :

find -name 'file*' -size 0 -delete 

@alper find accepts a directory as its first argument, i.e. find /home/user/ -name «file* . » . Highly recommended: first use with -print instead of -delete , and then only when the result is satisfying, delete files.

If you want to find and remove all 0-byte files in a folder:

find /path/to/folder -size 0 -delete 
find . -maxdepth 1 -type f -size 0 -delete 

This finds the files with size 0 in the current directory, without going into sub-directories, and deletes them.

To list the files without removing them:

find . -maxdepth 1 -type f -size 0 

You can use the following command:

And if are looking to delete the 0 byte files in subdirectories as well, omit -maxdepth 1 in previous command and execute.

Delete all files named file. in the current directory:

find . -name file* -maxdepth 1 -exec rm <> \; 

This will still take a long time, as it starts rm for every file.

I guess you should use double quotes: -name «file*» Otherwise the pattern will be expanded by the shell.

This doesn’t limit the rm to files with 0 bytes. To be fair, though, neither does the code the OP posted.

You can use + instead of ; to have find call rm with multiple arguments instead of invoking a process for each file.

you can even use the option -delete which will delete the file.

from man find, -delete Delete files; true if removal succeeded.

Here is an example, trying it yourself will help this to make sense:

bash-2.05b$ touch empty1 empty2 empty3 bash-2.05b$ cat > fileWithData1 Data Here bash-2.05b$ ls -l total 0 -rw-rw-r-- 1 user group 0 Jul 1 12:51 empty1 -rw-rw-r-- 1 user group 0 Jul 1 12:51 empty2 -rw-rw-r-- 1 user group 0 Jul 1 12:51 empty3 -rw-rw-r-- 1 user group 10 Jul 1 12:51 fileWithData1 bash-2.05b$ find . -size 0 -exec rm <> \; bash-2.05b$ ls -l total 0 -rw-rw-r-- 1 user group 10 Jul 1 12:51 fileWithData1 

If you have a look at the man page for find (type man find ), you will see an array of powerful options for this command.

Источник

Оцените статью
Adblock
detector