- 5 способов очистить или удалить содержимое большого файла в Linux
- 1. Пустое содержимое файла путем перенаправления на Null
- 2. Пустой файл с использованием «настоящего» перенаправления команд
- 3. Пустой файл с помощью утилиты cat/cp/dd с /dev/null
- 4. Очистить файл с помощью команды echo
- 5. Очистить файл с помощью команды truncate
- Linux удалить файл размером 0
- Удаление файлов нулевого размера 0
- How to delete many 0 byte files in linux?
- 10 Answers 10
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 не выводить завершающую новую строку, которая ведет к пустой строке, созданной в предыдущей команде.
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 -deletefly4life, четай man find :))
В man’е есть такая секция ‘EXAMPLES’, посмотри, как там предлагается удалять найденные файлы 😉
Хотя, твой вариант с ‘-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.