====== Трюки в консоли: работа с файлами и директориями ======
==== Как конвертировать в JPEG/PNG только первую страницу PDF ====
convert -density 200 rtfm.pdf[0] -quality 95 rtfm.png
==== Как конвертировать PDF в JPEG ====
https://jdhao.github.io/2019/11/20/convert_pdf_to_image_imagemagick/
==== Как сжать PDF ====
Пару раз сталкивался со сканами документов 50+ МБ. В почту не влезают - надо уменьшать.
ImageMagick
convert input.pdf -format JPG -quality 75 output.pdf
Скрипт [[http://www.alfredklomp.com/programming/shrinkpdf/|shrinkpdf]]
#!/bin/sh
# http://www.alfredklomp.com/programming/shrinkpdf
# Licensed under the 3-clause BSD license:
#
# Copyright (c) 2014-2019, Alfred Klomp
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
# 3. Neither the name of the copyright holder nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
shrink ()
{
gs \
-q -dNOPAUSE -dBATCH -dSAFER \
-sDEVICE=pdfwrite \
-dCompatibilityLevel=1.3 \
-dPDFSETTINGS=/screen \
-dEmbedAllFonts=true \
-dSubsetFonts=true \
-dAutoRotatePages=/None \
-dColorImageDownsampleType=/Bicubic \
-dColorImageResolution=$3 \
-dGrayImageDownsampleType=/Bicubic \
-dGrayImageResolution=$3 \
-dMonoImageDownsampleType=/Subsample \
-dMonoImageResolution=$3 \
-sOutputFile="$2" \
"$1"
}
check_smaller ()
{
# If $1 and $2 are regular files, we can compare file sizes to
# see if we succeeded in shrinking. If not, we copy $1 over $2:
if [ ! -f "$1" -o ! -f "$2" ]; then
return 0;
fi
ISIZE="$(echo $(wc -c "$1") | cut -f1 -d\ )"
OSIZE="$(echo $(wc -c "$2") | cut -f1 -d\ )"
if [ "$ISIZE" -lt "$OSIZE" ]; then
echo "Input smaller than output, doing straight copy" >&2
cp "$1" "$2"
fi
}
usage ()
{
echo "Reduces PDF filesize by lossy recompressing with Ghostscript."
echo "Not guaranteed to succeed, but usually works."
echo " Usage: $1 infile [outfile] [resolution_in_dpi]"
}
IFILE="$1"
# Need an input file:
if [ -z "$IFILE" ]; then
usage "$0"
exit 1
fi
# Output filename defaults to "-" (stdout) unless given:
if [ ! -z "$2" ]; then
OFILE="$2"
else
OFILE="-"
fi
# Output resolution defaults to 72 unless given:
if [ ! -z "$3" ]; then
res="$3"
else
res="72"
fi
shrink "$IFILE" "$OFILE" "$res" || exit $?
check_smaller "$IFILE" "$OFILE"
./shrinkpdf.sh in.pdf > out.pdf
You can also provide a second filename for the output:
./shrinkpdf.sh in.pdf out.pdf
And an output resolution in DPI (default is 72 DPI):
./shrinkpdf.sh in.pdf out.pdf 90
==== Просмотр логов в gz архивах ====
К примеру нужно посмотреть лог nginx, который уже запакован в gz через logrotate. На помощь приходит [[http://linux.die.net/man/1/zgrep|zgrep]]
zgrep 'find-text' /var/log/nginx/file.gz
zgrep 'find-text' /var/log/nginx/access_log.gz.*
zgrep 'GET /url' /var/log/nginx/access_log.gz
zgrep 'GET /url' /var/log/nginx/access_logaccess_log.gz | more
==== find non default chmod ====
Или как найти неожиданные и странные права на каталогах.
find . -printf "%m\t%p\n" | grep -Ev "^(755|644)"
FIXME
$ find . -type f ! \( -perm 755 -o -perm 644 \) -printf "%m\t%p\n" | grep 755
$ find . -type f ! \( -perm 755 -o -perm 644 \) -printf "%m\t%p\n" | grep 644
find -type d -not -perm 775 -o -type f -not -perm 664
find -type f -not -perm 664
find -type d -not -perm 775
find \! -perm 775 -type d -exec chmod 775 {} \;
find \! -perm 664 -type f -exec chmod 664 {} \;
==== Удалить пустые директории ====
Найти пустые директории
find . -type d -empty -print
Удалить пустые директории
find . -type d -empty -delete
==== Перенаправить вывод команды в тектовый файл ====
/opt/foobar/app.sh > /home/foobar/app.txt
==== Перенаправить вывод команды в тектовый файл + вывести на экран ====
/opt/foobar/app.sh | tee /home/foobar/app.txt
==== Вывести файл без комментариев и пустых строк ====
# cat /etc/my.cnf |sed '/^$/d' |grep -v "#" |more
==== Как узнать время последнего доступа и изменения файла ====
http://inet6.alphasca.net/как-узнать-время-последнего-доступа-и/
==== Узнать время модификации файла ====
via http://oper777.blogspot.ru/2012/06/blog-post.html
stat -c "%Y" filename
==== Изменить дату создания файла ====
# touch --date="2016-07-13" /home/user/file.txt
via http://host116.ru/doku.php/it:linux:recepty:izmenit_vremja_sozdanija_fajla
==== Заменить слово в файле ====
# sed -i -e 's/word1/word2/g' ${FILE}
==== Как вывести хуман ридабл в ls ====
[[https://drewsymo.com/2016/05/09/how-do-i-view-file-sizes-kbmbgb-with-ls-in-linux/|Вот так]]
ls -lah
[[http://notes.jerzygangi.com/how-i-use-ls-linux/|Убрать из вывода юзера/группу]]
ls -lAhog
Еще десяток возможностей **ls** [[https://dannyda.com/2020/03/06/ls-command-examples-introduction-to-ls-command-in-linux-how-to-use-ls-in-linux/|здесь]]
==== ls Killed ====
При попытке посчитать количество файлов в каталоге (как потом оказалось >3 млн файлов).
# ls -f /var/www/user/data | wc -l
всё завершается ошибкой killed out of memory.
А всего-то [[http://stackoverflow.com/questions/1427032/fast-linux-file-count-for-a-large-number-of-files|надо было добавить]] один ключ к ls
* -f — не сортировать содержимое каталога; выдавать файлы в том порядке, в котором они записаны на диск ([[https://ru.wikipedia.org/wiki/Ls|wikipedia]])
* -f — do not sort, enable -aU, disable -ls --color ([[https://linux.die.net/man/1/ls|man]])
==== find ====
| Поиск файлов по имени | find /var/www/ -name "file.conf" \\ find /var/www/ -name "*.conf" |
| Поиск без учёта регистра | find /var/www/ -iname file.conf |
| Поиск по размеру файлов | find /home/user -size +10M |
| Поиск по маске прав | find ./ -perm 700 |
| Файлы созданные или изменённые в течении последних 5 дней | find /home/user -type f -mtime -5 |
| Файлы созданные или изменённые в течении последних 5 минут | find /home/user -type f -mmin -5 |
| Найти файлы созданные или изменённые старше 30 дней (поиск устаревших файлов) | find /home/user -type f -mtime +30 |
| Время последнего обращения к которым более 5 дней | find /usr/bin -type f -atime +5 |
| Поиск строки в файлах | find ./ -type f -exec grep -i -H "STRING" {} \; |
| Найти все файлы php в который встречается строка STRING | find ./ -type f -name "*.php" -exec grep -i -H "STRING" {} \; |
| grep с опцией -R для поиска файлов по содержимому | grep "STRING" -R /path/for/find |
| Замена текста в файлах | find ./ -type f -name "*.conf" -exec sed -i s/OLDTEXT/NEWTEXT/g {} \; |
| Установка прав доступа 644 на все файлы в текущей директории и всех поддиректориях | find ./ -type f -exec chmod 644 {} \; |
| Установка прав доступа 755 на все папки в текущей директории и всех поддиректориях | find ./ -type d -exec chmod 755 {} \; |
==== Удалить файлы старше 10 дней ====
$ find ./ -ctime +10 | xargs rm
==== Как сменить кодировку файла ====
Пример из utf8 в win1251
# iconv -f utf8 -t cp1251 old_unicode.txt -o new_windows.txt
---->Подробности в **iconv --help**
Usage: iconv [OPTION...] [FILE...]
Convert encoding of given files from one encoding to another.
Input/Output format specification:
-f, --from-code=NAME encoding of original text
-t, --to-code=NAME encoding for output
Information:
-l, --list list all known coded character sets
Output control:
-c omit invalid characters from output
-o, --output=FILE output file
-s, --silent suppress warnings
--verbose print progress information
-?, --help Give this help list
--usage Give a short usage message
-V, --version Print program version
<--
==== Создать пустой random файл ====
Вариант с urandom. TODO изучить, как сделать через openssl.
dd if=/dev/urandom of=1GB.bin bs=1G count=1
// или так
dd if=/dev/urandom of=1GB.bin bs=64M count=16
==== Быстро создать файл заданного размера ====
Нет, не dd.
# fallocate -l 10G vm_image_10GB.img
==== Exim лог \320 кодировка ====
Exim пишет в лог что-то неразборчивое, используем printf
printf "\321\203 \320\222\320\260\321\201 \320\275\320\276\320\262\320\276\320\265 \321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\265"
будет преобразовано в 'у Вас новое сообщение'
==== Быстро скопировать через rsync много файлов на другой сервер ====
Задача: перенести сайт на новый сервер, но для бэкапа нет места.\\
Решение: копируем по сети все файлы через rsync
Пример
# rsync -azh --progress --stats /var/www/user/data/www/ -e 'ssh -p 50222' root@2.3.4.111:/var/www/user/data/www/
Флаг **-а** это алиас для следующих флагов
* r – рекурсивно скачивать всё
* l – передавать все найденные симлинки
* t – сохранить таймстемпы
* p – сохранить права
* g – сохранить группы
* o – сохранить owner'а
* D – FIXME Preserve block and character devices
Другие флаги
* z - сжатие файлов
* h - хуман ридабл
* e - если нужно например передать альтернативный порт ssh
* progress - индикатор выполнения (можно использовать -P, который включает в себя progress и partial. Partial возобновляет прерванную передачу
* stats - какая-то статистика
Очень важно. Есть разница между **rsync /var/www/site /home/user/html** и **rsync /var/www/site/ /home/user/html**
Без слэша будет скопирована директория site и все файлы внутри.\\
Со слэшем будут скопированы все файлы внутри указанной директории, но не сама директория