с util-linux 2.25, fallocate
утилита на Linux имеет a -d
/--dig-hole
опция для этого.
fallocate -d the-file
Вырыл бы яму для каждого блока, полного нулей в файле
В более старых системах можно сделать это вручную:
Linux имеет a FALLOC_FL_PUNCH_HOLE
опция к fallocate
это может сделать это. Я нашел сценарий на GitHub с примером:
Использование FALLOC_FL_PUNCH_HOLE из Python
Я изменил его немного, чтобы сделать то, что Вы спросили - дыры перфорации в регионах файлов, которые заполнены нулями.Вот:
Используя FALLOC_FL_PUNCH_HOLE от Python до дыр перфорации в файлах
usage: punch.py [-h] [-v VERBOSE] FILE [FILE ...]
Punch out the empty areas in a file, making it sparse
positional arguments:
FILE file(s) to modify in-place
optional arguments:
-h, --help show this help message and exit
-v VERBOSE, --verbose VERBOSE
be verbose
Пример:
# create a file with some data, a hole, and some more data
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=0
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=2
# see that it has holes
$ du --block-size=1 --apparent-size test1
12288 test1
$ du --block-size=1 test1
8192 test1
# copy it, ignoring the hole
$ cat test1 > test2
$ du --block-size=1 --apparent-size test2
12288 test2
$ du --block-size=1 test2
12288 test2
# punch holes again
$ ./punch.py test2
$ du --block-size=1 --apparent-size test2
12288 test2
$ du --block-size=1 test2
8192 test2
# verify
$ cmp test1 test2 && echo "files are the same"
files are the same
Отметьте это punch.py
только находит, что блоки 4 096 байтов выбивают, таким образом, это не могло бы сделать файл точно столь же редким, как это было, когда Вы запустили. Это могло быть сделано более умным, конечно. Кроме того, это только слегка тестируется, так быть осторожным и сделать резервные копии прежде, чем доверять ему!
Можно использовать getent
команда с hosts
параметр как это:
getent hosts www.google.com
И количество, сколько результатов это добирается:
getent hosts www.google.com | wc -l
getent
пользуется службой имен библиотеки Switch, чтобы сделать различные поиски имени. Со вторым параметром можно определить, какой вид дб Вы хотите к поиску. Проверить man getent
для деталей.
Показ двух возможных подходов, которые являются портативными.
#!/bin/sh
reverseDNS=$(host 8.8.8.8)
if [ $? != 0 ]; then
printf '%s\n' "Reverse DNS [FAILED]"
else
printf '%s\n' "Reverse DNS [OK]"
fi
###### nslookup ##########
nslookup_func(){
nslookup=$(nslookup google.com)
if [ "$nslookup" = ";; connection timed out; no servers could be reached" ]; then
printf '%s\n' "nslookup [FAILED]"
else
printf '%s\n' "nslookup [OK]"
fi
}
nslookup_func