====== Трюки в консоли: работа с файлами и директориями ====== ==== Как конвертировать в 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 и все файлы внутри.\\ Со слэшем будут скопированы все файлы внутри указанной директории, но не сама директория