====== Трюки в консоли: каталоги, файлы ======
==== cp: cannot stat ====
По крону выполняется команда
cp /home/rtfm/files/* /home/rtfm/bak
Получаю ошибку
Ошибка **cp: cannot stat '/home/rtfm/files/*': No such file or directory**
Директория files не всегда содержит файлы.\\
При использовании * копируются все файлы. Если директория пустая, то cp ищет файлы с именем *.
Решение простое, но неочевидное - вместо ''*'' ставим ''.'' и добавляем ключ ''-r''
cp /home/rtfm/files/. /home/rtfm/bak
Вместо -r можно использовать -a (рекурсивно копирует + сохраняет все атрибуты файла, а также символические ссылки)
==== Вывод ls chmod в числовом формате ====
Разные варианты
* [[https://stackoverflow.com/questions/1795976/can-the-unix-list-command-ls-output-numerical-chmod-permissions|Can the Unix list command 'ls' output numerical chmod permissions?]]
* [[https://askubuntu.com/questions/144921/how-to-get-chmod-octal-permissions-of-the-folder-in-the-terminal|How to get chmod (octal) permissions of the folder in the terminal?]]
* [[https://askubuntu.com/questions/152001/how-can-i-get-octal-file-permissions-from-command-line|How can I get octal file permissions from command line?]]
Мне понравился вариант с [[https://askubuntu.com/a/696271|askubuntu]].
Закидываем в .bashrc функцию
function lsl2
{
find . -maxdepth 1 | sort | xargs -I{} stat --format="%a %h %U %G %s %y %n" {} | awk '{$7=substr($7,1,5);$8 =" ";print}'
}
==== Скопировать файл без пробела в имени в файл с пробелом ====
Скопировать ''FooBar'' в ''Foo Bar''
cp "FooBar" "Foo Bar"
или через ''\_'' где ''_'' это пробел
cp FooBar Foo\ Bar
==== logrotate не удаляет старые архивы ====
Rotate/maxage установлены, но gz архивов явно больше. Решение - добавить postrotate и find с mtime delete.
/home/john/logs/*.log {
daily
missingok
rotate 14
#maxage 14
compress
delaycompress
notifempty
create 640 devuf devuf
sharedscripts
postrotate
find /home/john/logs/* -name "*.log.*.gz" -mtime +14 -delete
endscript
}
===== Примеры GREP =====
| Найти строку в текущей дире | grep -R "find me" * |
| Найти строку в файле | grep "find me" myfile.txt |
| Подсветить результат | grep -R "find me" myfile.txt --color |
| Я не беспокоюсь о РЕГИСТРЕ | grep -i "find me" myfile.txt |
| Покажите мне номер строки | grep -n "find me" myfile.txt |
| Покажите в каком файле | grep -l "find me" * |
| Как частво встречается | grep -c "find me" myfile.txt |
| Покажите конкретный стринг \\ started, а не restarted, start или starting | grep -w "started" error.log |
| Покажите мне 5 строк до и 5 строк после интересующей меня строки | grep "started" -B5 -A5 error.log или grep "started" -C5 error.log |
| Показать совпадение в начале строки | grep "^find me" myfile.txt |
| Показать совпадение в конце строки | grep "find me$" myfile.txt |
| Искать А или Б | egrep "foo|bar" myfile.txt |
| Искать в gzip | zgrep "find me" myfile.gz |
===== Найти измененные файлы за последний день =====
$ find . -mtime -1
* -amin последний доступ к файлам в минутах
* -atime последний доступ к файлам в днях
* -cmin время создания файлов в минутах
* -ctime время создания файлов в днях
* -mmin время модификации файлов в минутах
-mtime можно использовать еще и так
* -1 последние 24 часа
* -0.5 последние 12 часов
* -0.25 последние 6 часов
* +3 более чем 3 дня
Множество примеров по find - https://coderwall.com/t/find/popular
===== Удалить все файлы кроме определенного расширения =====
Рекурсивно удалить все файлы, кроме файлов с определенным расширением
find . -type f ! -name '*.txt' -delete
[[https://unix.stackexchange.com/questions/78376/in-linux-how-to-delete-all-files-except-the-pattern-txt|via]]
===== Найти последние 500 измененных директорий и файлов =====
Директории
find ./ -type d -printf '%T@ %p\t\t %t\n' | sort -k 1 -nr | sed 's/^[^ ]* //' | head -n 500
Файлы
find ./ -type f -printf '%T@ %p\t\t %t\n' | sort -k 1 -nr | sed 's/^[^ ]* //' | head -n 500
===== Удалить пустые строки в файле =====
sed '/^$/d' file-in.txt >> file-out.txt
Работает в zsh Lin/Mac
===== nice и ionice =====
[[https://www.opennet.ru/tips/1684_nice_ionice_cfq_scheduler_backup_kernel_linux.shtml|Как минимизировать влияние бэкап-скрипта на интенсивность ввода/вывода в Linux]] (opennet)
Задача понизить влияние скрипта ''/etc/cron.d/backup.sh'' на систему (снизить нагрузку).
Уменьшить приоритет ввода-вывода
/usr/bin/ionice -c2 -n7 /etc/cron.d/backup.sh
Параметр **-n** может принимать значения от 0 до 7. 7 наименьший приоритет, 1 максимальный приоритет.
* 1 - real time
* 2 - нормальный режим
* 3 - работа только в моменты простоя (idle)
* 7 - cамый низкий уровень приоритета
Уменьшить приоритет CPU
/usr/bin/nice -n 19 /etc/cron.d/backup.sh
Параметр **-n** может принимать значения от -20 до 19. 19 наименьший приоритет, -20 максимальный приоритет.
**nice** и **ionice** можно комбинировать
/usr/bin/nice -n 19 /usr/bin/ionice -c2 -n7 /etc/cron.d/backup.sh
===== ls -la с датой и временем =====
**ls -la**
-rw-------. 1 root root 8487 Apr 1 10:21 .bash_history
-rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
drwx------. 3 root root 18 Feb 5 20:15 .config
-rw-r--r--. 1 root root 9908 Aug 10 2014 nux-dextop-release-0-5.el7.nux.noarch.rpm
-rw-r--r--. 1 root root 29345082 May 16 2019 serviio-2.0-linux.tar.gz
**ls -la --time-style=long-iso**
-rw-------. 1 root root 8487 2020-04-01 10:21 .bash_history
-rw-r--r--. 1 root root 18 2013-12-29 06:26 .bash_logout
-rw-r--r--. 1 root root 176 2013-12-29 06:26 .bash_profile
-rw-r--r--. 1 root root 176 2013-12-29 06:26 .bashrc
drwx------. 3 root root 18 2020-02-05 20:15 .config
-rw-r--r--. 1 root root 9908 2014-08-10 03:11 nux-dextop-release-0-5.el7.nux.noarch.rpm
-rw-r--r--. 1 root root 29345082 2019-05-16 00:30 serviio-2.0-linux.tar.gz
===== ls -la вывод прав в числовом формате =====
Вопрос вроде бы частый, но удобного решения не нашёл. Ухищрения с find или stat это слишком сложно.