Полезности для работающих в командной строке *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 ./

Вот :)