RTFM.WIKI

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

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

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


linux:terminal:terminal_tnt_files

Трюки в консоли: работа с файлами и директориями

Как конвертировать в JPEG/PNG только первую страницу PDF

convert -density 200 rtfm.pdf[0] -quality 95 rtfm.png

Как конвертировать PDF в JPEG

Как сжать PDF

Пару раз сталкивался со сканами документов 50+ МБ. В почту не влезают - надо уменьшать.

ImageMagick

convert input.pdf -format JPG -quality 75 output.pdf

Скрипт 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. На помощь приходит 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/как-узнать-время-последнего-доступа-и/

Узнать время модификации файла

Изменить дату создания файла

# 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

Вот так

ls -lah

Убрать из вывода юзера/группу

ls -lAhog

Еще десяток возможностей ls здесь

ls Killed

При попытке посчитать количество файлов в каталоге (как потом оказалось >3 млн файлов).

# ls -f /var/www/user/data | wc -l

всё завершается ошибкой killed out of memory.

А всего-то надо было добавить один ключ к ls

  • -f — не сортировать содержимое каталога; выдавать файлы в том порядке, в котором они записаны на диск (wikipedia)
  • -f — do not sort, enable -aU, disable -ls –color (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 и все файлы внутри.
Со слэшем будут скопированы все файлы внутри указанной директории, но не сама директория

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/terminal/terminal_tnt_files.txt · Последнее изменение: 2023/01/22 00:41 — dx