Полезности для работающих в командной строке *nix
Материал из RSU WiKi
Основа: http://www.iway.ru/new/unix/faq/
Я тут составляю потихоньку маленький справочник по bash, часто удобно автоматизировать некоторые операции за счет небольших скриптиков или команд.
Содержание |
Полезности для работающих в командной строке *nix
#find . -maxdepth 1 -type d -exec du -sk {} \; | sort -rn
или подлинее
#find . -maxdepth 1 -type d -print | xargs du -sh | sort -rn
Команда, предназначенная для вывода всех поддиректорий с размерами
#:>file
То же, что и
#cat /dev/null > file
Обнуление файла
#egrep -v "^#|^[:blank:]*$" file
или, проще
#egrep -v "^#|^$" file
Просмотр файла без комментариев и пустых строк. Особенно удобно для просмотра конфигов.
#for x in *; do mv "$x" `echo $x | sed -e 's/ /_/g'`; done
удаление пропусков в именах файлов и директорий и подстановка нижней черты ,,_,, в определенном каталоге замена пробелов в именах файлов и каталогов на символ подчеркивания
#for x in *; do OLDFILE=$x; NEWFILE=`echo $x | perl -i -npe "s/БЫЛО/СТАЛО/ig";`;echo $OLDFILE to $NEWFILE; done
переименование файлов в директории по правилу, указыаемому в регулярном выражении. Вместо БЫЛО и СТАЛО нужно поставить правила регулярных выражений, а вместо echo - когда убедитесь, что делает что надо, поставить mv, "to" убрать совсем - в mv он, конечно, не нужен.
while [ -e "$1" ] do NEW=`date -r "$1" +%Y-%m-%d_%Hh%M` echo "$1 -> "$NEW"_"$1 # mv "$1" $NEW"_$1" shift done
Скриптик, добавляющий в начало имен файлов, перечисленных в комадной строке дату и время. Нужно раскомментировать mv, чтобы он реально переименовывал. Можно модифицировать так, чтобы только дата, например, прибавлялась и не в начало, а в конец.
Убираем \r во всех файлах директории:
sed -i -re 's/\x0d//g' *.txt
или
find /path/to/dir -type f | while read i; do perl -pe 's/\r//g' -i "$i"; done
или
tr -d "\r" < file.DOS > file.UNIX
Удаляем в каталоге все файлы кроме указанных:
rm !(file1|file2|…)
Дать группе пользователи права записи во все существующие и вновь создаваемые подкаталоги конкретной директории (Posix ACL):
setfacl -R -m g:users:w dir/
Указываем AWK, что в строке несколько разделителей колонок (в примере «пробел» и «#»):
awk -F "[\ ,#] "'{ print $7 }' < our_file
Просто найти файл:
find / -type f -name "myfile" -print
SED
Заменяет любое колличество табов (\t) на один:
sed -e 's/\t[\t]*/\t/g' inputFile
Mount
Примонтируем одну папку в другую (полезно для FTP-серверов, которые не работают с симлинками):
mount --bind /foo /home/fred/foo
Строчка для fstab (автоподмонтирование при загрузке системы):
/foo /home/fred/foo auto bind 0 0
FTP
Закачиваем локальный файл в каталог на удаленном ftp-сервере:
ftp -u ftp://ftp.cexample.com/incoming/ LocalFilename.gz
SSH
Для тех, кто часто использует терминал и ssh данная хитрость буде весьма удобна. Добавьте следующую строчку в ваш файл .bash_profile:
complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh
Это добавит возможность дополнения в адресах хостов, с которыми вы соединяетесь через ssh. Хосты берутся из файла ~/.ssh/known_hosts.
Simple password generation
Способ №1
dd if=/dev/urandom bs=6 count=1|base64
Способ №2
cat /dev/[u]random | uuencode -m - | head -n 2 | tail - -c длина пароля
Рекурсивно 755/644 на каталоги и файлы
Нужно в одном скрипте сделать чтобы права на все файлы в каталогах и подкаталогах стали 0644, а на все каталоги 0755.
Способ 0
chmod -R a-x+rX directory/
Способ 1
find /path -type d -exec chmod 0755 "{}" ";"
find /path -type t -exec chmod 0644 "{}" ";"
Способ 2
работающий существенно быстрее (на порядок примерно)
find /path -type d -print0 | xargs -0 chmod 0755 find /path -type f -print0 | xargs -0 chmod 0644
Быстрая передача файла через псевдо-HTTP
Когда есть необходимость передать файл с одной машины на другую, а под рукой нет общедоступных ресурсов, можно сделать так:
nc -l -p 8080 < file
или
netcat -l 8080 < file
на клиенте достаточно в браузере набрать http://192.168.0.123:8080
Собственно, все. Впрочем, если получатель - блондинка, которая не знает команды File-Save, можно написать так:
(echo -e "HTTP/1.1 200\nContent-Disposition: attachment; filename=gena_na.png\nContent-Type: application/octet- stream\nConnection: close\n"; cat vim_mrxvt.png ) | nc -vv -l -p 8080
Но это еще не все. Можно дать доступ к целой директории, написав простой HTTP сервер в одной строке:
while true; do nc -vv -l -p 8080 -c '( read a b c; file=`echo $b | sed 's/[^a-z0-9.]//g'`; if [ a$file = "a" ]; then ( ls | (while read f; do echo "<a href=$f>$f</a>
"; done) ); else cat $PWD/$file; fi )'; sleep 1; done
Этот скрипт отдает все файлы, которые есть в текущем каталоге и не позволяет его сменить. В случае, если запрашивается корневая директория, то управление передается своеобразному mod_index - т.е. выводится список файлов-ссылок. В конце добавлена задержка в 1 сек для того, чтобы была возможность убить его нажатием Ctrl-C.
См. подробнее http://connection-refused.blogspot.com/2006/12/http-222.html
Cron
* * * * * command to be executed - - - - - | | | | | | | | | +----- day of week (0 - 6) (Sunday=0) | | | +------- month (1 - 12) | | +--------- day of month (1 - 31) | +----------- hour (0 - 23) +------------- min (0 - 59)
Как перекинуть по сети ВСЕ, если нет НИЧЕГО
нужен только netcat, аццкий многофункциональный "перочинный нож", который есть в любой UNIX-системе. Итак, берем netcat. на стороне, с которой хотим стянуть информацию пишем в терминале:
tar -c ./*| netcat somehost.somedomain 10000 -v
на принимающей стороне, собственно тоже пишем:
netcat -l -p 10000 -v| tar -x ./
Вот :)

