RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


Stylesheet conf/userstyle.css not found, please contact the developer of "dokuwiki_2024" template.
linux:terminal:terminal_tnt_files

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
linux:terminal:terminal_tnt_files [2021/10/17 02:46] – внешнее изменение 127.0.0.1linux:terminal:terminal_tnt_files [2023/01/22 00:41] (текущий) dx
Строка 1: Строка 1:
 +====== Трюки в консоли: работа с файлами и директориями ======
  
 +==== Как конвертировать в JPEG/PNG только первую страницу PDF ====
 +
 +<code bash>
 +convert -density 200 rtfm.pdf[0] -quality 95 rtfm.png
 +</code>
 +
 +==== Как конвертировать PDF в JPEG ====
 +
 +https://jdhao.github.io/2019/11/20/convert_pdf_to_image_imagemagick/
 +
 +==== Как сжать PDF ====
 +
 +Пару раз сталкивался со сканами документов 50+ МБ. В почту не влезают - надо уменьшать.
 +
 +ImageMagick
 +
 +<code bash>convert input.pdf -format JPG -quality 75 output.pdf</code>
 +
 +Скрипт [[http://www.alfredklomp.com/programming/shrinkpdf/|shrinkpdf]] 
 +
 +<hidden>
 +<code bash>
 +#!/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"
 +</code>
 +</hidden>
 +
 +<code bash>
 +./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
 +</code>
 +
 +==== Просмотр логов в gz архивах ====
 +
 +К примеру нужно посмотреть лог nginx, который уже запакован в gz через logrotate. На помощь приходит [[http://linux.die.net/man/1/zgrep|zgrep]]
 +
 +<code bash>
 +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
 +</code>
 +
 +==== find non default chmod ====
 +
 +Или как найти неожиданные и странные права на каталогах.
 +
 +<code bash>find . -printf "%m\t%p\n" | grep -Ev "^(755|644)"</code>
 +
 +FIXME
 +
 +<code bash>
 +$ 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
 +</code>
 +
 +<code bash>
 +find -type d -not -perm 775 -o -type f -not -perm 664
 +find -type f -not -perm 664
 +find -type d -not -perm 775
 +</code>
 +
 +<code bash>
 +find \! -perm 775 -type d -exec chmod 775 {} \;
 +find \! -perm 664 -type f -exec chmod 664 {} \;
 +</code>
 +
 +==== Удалить пустые директории ====
 +
 +Найти пустые директории
 +
 +<code bash>find . -type d -empty -print</code>
 +
 +Удалить пустые директории
 +
 +<code bash>find . -type d -empty -delete</code>
 +
 +==== Перенаправить вывод команды в тектовый файл ====
 +
 +<code bash>/opt/foobar/app.sh > /home/foobar/app.txt</code>
 +
 +==== Перенаправить вывод команды в тектовый файл + вывести на экран ====
 +
 +<code bash>/opt/foobar/app.sh | tee /home/foobar/app.txt</code>
 +
 +==== Вывести файл без комментариев и пустых строк ====
 +
 +<code bash># cat /etc/my.cnf |sed '/^$/d' |grep -v "#" |more</code>
 +
 +==== Как узнать время последнего доступа и изменения файла ====
 +
 +http://inet6.alphasca.net/как-узнать-время-последнего-доступа-и/
 +
 +==== Узнать время модификации файла ====
 +
 +via http://oper777.blogspot.ru/2012/06/blog-post.html
 +
 +<code bash>stat -c "%Y" filename</code>
 +
 +==== Изменить дату создания файла ====
 +
 +<code bash># touch --date="2016-07-13" /home/user/file.txt</code>
 +
 +via http://host116.ru/doku.php/it:linux:recepty:izmenit_vremja_sozdanija_fajla
 +
 +==== Заменить слово в файле ====
 +
 +<code bash># sed -i -e 's/word1/word2/g' ${FILE}</code>
 +
 +==== Как вывести хуман ридабл в ls ====
 +
 +[[https://drewsymo.com/2016/05/09/how-do-i-view-file-sizes-kbmbgb-with-ls-in-linux/|Вот так]]
 +
 +<code>ls -lah</code>
 +
 +[[http://notes.jerzygangi.com/how-i-use-ls-linux/|Убрать из вывода юзера/группу]]
 +
 +<code>ls -lAhog</code>
 +
 +Еще десяток возможностей **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 млн файлов).
 +
 +<code bash># ls -f /var/www/user/data | wc -l</code>
 +
 +всё завершается ошибкой 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 дней ====
 +
 +<code bash>$ find ./ -ctime +10 | xargs rm</code>
 +
 +==== Как сменить кодировку файла ====
 +
 +Пример из utf8 в win1251
 +
 +<code bash># iconv -f utf8 -t cp1251 old_unicode.txt -o new_windows.txt</code>
 +
 +---->Подробности в **iconv --help**
 +
 +
 +<code>
 +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
 +</code>
 +<--
 +
 +==== Создать пустой random файл ====
 +
 +Вариант с urandom. TODO изучить, как сделать через openssl.
 +
 +<code bash>
 +dd if=/dev/urandom of=1GB.bin bs=1G count=1
 +// или так
 +dd if=/dev/urandom of=1GB.bin bs=64M count=16
 +</code>
 +
 +==== Быстро создать файл заданного размера ====
 +
 +Нет, не dd.
 +
 +<code bash># fallocate -l 10G vm_image_10GB.img</code>
 +
 +==== Exim лог \320 кодировка ====
 +
 +Exim пишет в лог что-то неразборчивое, используем printf
 +
 +<code>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"</code>
 +
 +будет преобразовано в 'у Вас новое сообщение'
 +
 +==== Быстро скопировать через rsync много файлов на другой сервер ====
 +
 +Задача: перенести сайт на новый сервер, но для бэкапа нет места.\\
 +Решение: копируем по сети все файлы через rsync
 +
 +Пример
 +
 +<code bash># rsync -azh --progress --stats /var/www/user/data/www/ -e 'ssh -p 50222' [email protected]:/var/www/user/data/www/</code>
 +
 +Флаг **-а** это алиас для следующих флагов
 +
 +  * 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 и все файлы внутри.\\
 +Со слэшем будут скопированы все файлы внутри указанной директории, но не сама директория