Кратки съвети за bash

Тук може да намерите полезни съвети и примери за много ситуации.

 

Търсене и замяна на низ в Bash

За да замените всички срещания на 'yy' с 'zz' в променливата X, използвайте следния израз:

${X//yy/zz}

Един пример:

ORIG="foo to the bar"
REPLACED=${ORIG//bar/baz}
echo $REPLACED

Резултатът е:
foo to the baz

Argument list too long или използване на xargs

Да предположим, че искате да изтриете всички jpeg картинки от няколко директории. Пишете:
rm -f `find . -name *.jpg -type f`
но получавате само "Argument list too long" ("Твърде дълъг списък с аргументи"). За да се справите с този проблем използвайте xargs, който ще раздели автоматично списъка на няколко по-малки и ще ги подаде на rm:
find . -name *.jpg -type f | xargs rm -f
По този начин командата rm се изпълнява няколко пъти и резултата е на лице - файловете са изтрити.

Създаване на файлове с определена големина чрез dd

За да създадете файл с произволно съдържание и точно определена дължина, бързо удобно е да се използва dd. Ето няколко примера.

Файл test1.bin, с големина 10k и съдържание от нулеви байтове:
dd bs=1024 count=10 if=/dev/zero of=test1.bin

Файл test2.bin, с големина 100k и случайно съдържание:
dd bs=1024 count=100 if=/dev/random of=test2.bin

Горният пример е доста бавен, особено за големи файлове, затова ето един начин за бързо генериране на относително случайни данни:
dd bs=1024 count=100 if=/dev/hda of=test2.bin skip=1000
Тази команда взима 100k данни от твъдият диск като започва от 1М след началото.

Последната дума от низ в bash

Последната дума може да се вземе с командата awk '{print $NF}':

echo "one two three" | awk '{print $NF}'

връща

three

Добавяне на публичният ключ към authorized_key файла на отдалечен хост с един ред

cat ~/.ssh/id_rsa.pub | ssh hostname "cat >> ~/.ssh/authorized_keys"

Rsync по ssh на нестандартен порт

Ако използвате rsync през ssh, за да се свързвате със сървър на различен от стандартния порт, например 555 вместо 22, използвайте следния формат:

rsync -a -e "ssh -p 555" rsyncuser@remoteserver:/data/to/sync /archive/

Повече за rsync

Добавяне на дата към всеки изведен ред

Представете си следната ситуация: пишете програма или скрипт, която извежда нещо на конзолата. Точно когато всичко е почти готово, осъзнавате че се нуждаете от точното време, в което всяко съобщение е изведено. Например искате да знаете по колко време отнема архивирането на домашната директория на всеки потребител. Едно решение е да заместите навсякъде в кода всяка команда за изход с подобрен еквивалент, който извежда и времето. Ето един много по-мързелив начин да се направи това само с един ред на bash:
 
> ./your_program | while read line; do stamp=`date`; echo "$stamp $line"; done
 
Пробвайте това:
 
> du -sc /home | while read line; do stamp=`date`; echo "$stamp $line"; done

Итериране по файлове с интервал в името в bash


Обикновено, когато трябва да се обходят няколко файла в bash, се ползват подобни конструкции:

for file in /dir/*.c
do
    echo $file
done


или

for file in `find /dir -name *.c`
do
    echo $file
done


И двете посочени не вършат работа, ако някой файл съдържа интервал в името си, например "file with space.c". В този случай се итерират трите части от името на файла - "file", "with" и "space.c", вместо цялото име. За да работим с такива файлове, ползваме нещо подобно:

find /dir -name *.c | while read file
do
    echo $file
done

Как да изключваме компютъра с Linux след определено време без инсталиране на допълнителни програми


Ако искате да можете да настройвате компютъра да се изключва след известно време (добре познатата функция "sleep" на телевизора), имате на разположение достатъчно програми за целта. По-долу е показан лесен начин да с енаправи това само с bash и at. Добавете следното в .bashrc файла:
 
sleeper() {
    echo 'init 0' | sudo at now + $1 minutes
}

 
Готово. Сега ако искате компютъра да се загаси след 50 минути:
 
sleeper 50

Използвайте pm-suspend и pm-hibernate вместо init 0 съответно за приспиване и хибернация.

 


Определяне на пълния път до директория в bash и cmd промпт

За да определите абсолютния път до текущата или която и да е относително адресирана директория, например по-горната на текущата, използвайте следните конструкции:

bash

parent_dir=`cd .. && pwd`


cmd

set current_dir=%CD%
cd ..
set parent_dir=%CD%
cd %current_dir%


Рекурсивно преименуване на всички файлове от едно разширение в друго с bash


Следния скрипт преименува всички файлове с разширение .jad в текущата директория и поддиректориите в разширение .java

for file in `find . -type f -name *.jad`
do
    mv $file `dirname $file`/`basename $file .jad`.java
done


Откриване на файлове, които не са притежание на даден потребител

Следната команда открива файловете в домашната директория на потребителя foo, които не са притежание на foo

find /home/foo ! -user foo

 


Откриване на даден Java class в директория с jar файлове


Ако имате директория с много jar фаилове и искате бързо да намерите този, който съдържа даден клас, ползвайте този скрипт:

findjar.sh:

dir=$1
class=$2
if [ $# -ne 2 ]
then
  echo "Usage: `basename $0` <directory> <class>"
  exit 1
fi

for file in `find $dir -name *.jar`
do
unzip -t $file | grep $class && echo $file
done

Пример: намиране на jar файл, който съдържа класа MyClass, в директорията /my/jars/folder:

findjar.sh /my/jars/folder MyClass