Кратки съвети за 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