Поиск дубликатов имен файлов по маске
Если нужно найти все файлы имена которых совпадают за исключением цифрового префикса, например, состоящего из двух цифр, то можно воспользоваться такой командой:
1 |
for filename in `ls .`; do name=`echo $filename | sed 's/[0-9][0-9]_//g'`; count=`find . -name "[0-9][0-9]_$name" | wc -l`; [[ $c > 1 ]] && echo $filename $count; done |
Массовое переименование файлов
Для того чтобы переименовать имена всех файлов и каталогов в текущем и всех вложенных каталогах и заменить подстроку в названии, например, с «mega» на «giga», можно выполнить следующую команду:
1 |
find ./ -name "*mega*" | awk '{print "mv \"" $0 "\" \"" gensub(/mega/,"giga", 1) "\""}' | sh |
или
1 |
find . -name "*mega*" | sed -r 's/(.*)(mega)(.*)/mv \1\2\3 \1giga\3/' | sh |
или без вложенности
1 |
for filename in *mega*; do newname=$(echo $filename | sed 's/mega/giga/'); echo "Rename file $filename -> $newname"; mv $filename $newname; done |
Массовое копирование файлов с одновременным переименованием
Одной командной строкой в bash можно скопировать и одновременно переименовать файлы:
1 |
find . -type f -name "*file_name*" | xargs -I{} echo "cp -b {} {}" | sed 's/file_name/new_name/2' | xargs -i -t sh -c "eval {}" |
Контекстная замена текста в файлах
Чтобы заменить все слова, например, «Word1» во всех текстовых файлах текущего каталога и всех подкаталогов на слово «Word2» без учета регистра:
1 |
grep -irlZIF "Word1" * | xargs -0 -l sed -i -e 's/Word1/Word2/gI' |
c учетом регистра:
1 |
grep -rlZIF "Word1" * | xargs -0 -l sed -i -e 's/Word1/Word2/g' |
или только в конкретных файлах
1 |
find . -name "*mega*" | xargs -l sed -i -e 's/mega/giga/g' |
Имя процесса от имени которого выполняется команда
Чтобы получить имя процесса от имени которого выполняется текущая команда можно с помощью:
1 |
ps --no-heading co command ${PPID} |
Завершение сессии без сохранения истории
Чтобы завершить сессию пользователя в аварийном режиме и без сохранения истории можно выполнить следующую команду:
1 |
kill -9 -$$ |
Информация о правах доступа к файлу или каталогу и всех родительских каталогов
Чтобы получить информацию о правах доступа к файлу или каталогу включая всех его родительских каталогов, можно выполнить следующую команду:
1 |
namei -l /absolute/path/to/file |
Пример результата выполнения команды:
1 2 3 4 5 |
dr-xr-xr-x root root / drwxr-xr-x root root absolute drwx------ user1 group1 path drwxr-xr-x user1 group1 to -rw-r--r-- user1 group1 file |
Проверка прав доступа на чтение к файлу
1 |
sudo -u username test -r /home/username/.ssh/authorized_keys && echo 'allow' || echo 'denied' |
Перенаправление вывода stderr в stdout
Определения:
stdout — информационный канал для вывода всех стандартных сообщений.
stderr — информационный канал с сообщениями об ошибках.
Чтобы перенаправить вывод сообщений об ошибках из потока stderr в поток stdout любую команду можно дополнить конструкцией 2>&1, где цифра «2» — это номер информационного канала с сообщениями об ошибках, знак «>» — команда перенаправления, знак «&» — символ ссылки, цифра «1» — номер информационного канала для вывода всех стандартных сообщений.
Например, это бывает нужно для обработки вывода stderr в потоке:
1 |
nginx -V 2>&1 | grep geo |
Кодирование и декодирование URL в bash
1 2 3 |
$ alias urldecode='python -c "import sys, urllib as ul; sys.stdout.write(ul.unquote_plus(sys.argv[1] if sys.stdin.isatty() else sys.stdin.read()));"' $ alias urlencode='python -c "import sys, urllib as ul; sys.stdout.write(ul.quote_plus(sys.argv[1] if sys.stdin.isatty() else sys.stdin.read()));"' |
Примеры:
1 2 3 4 5 |
$ urldecode 'q+werty%3D%2F%3B' q werty=/; $ cat 'q werty=/;' | urlencode q+werty%3D%2F%3B |
Полный путь к файлу
1 2 |
[user@server log]$ readlink -e messages /var/log/messages |
Отмена установки пакета YUM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
## Показывает список последних транзакций $ yum history Loaded plugins: fastestmirror ID | Login user | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 28 | root | 2016-03-21 09:49 | Downgrade | 2 27 | root | 2016-03-21 09:33 | Update | 2 26 | root | 2016-02-29 17:55 | Install | 1 25 | root | 2016-02-29 17:54 | Install | 4 24 | root | 2016-02-29 17:52 | Update | 1 23 | root | 2016-02-22 17:39 | Install | 25 22 | root | 2016-02-12 23:16 | Install | 1 21 | root | 2016-02-12 14:04 | I, U | 4 20 | root | 2016-02-12 14:03 | I, U | 15 19 | root | 2016-02-12 14:03 | I, U | 11 < ## Показывает подробную информацию о транзакции, где можно посмотреть какие именно пакеты были установлены $ yum history info 27 Loaded plugins: fastestmirror Transaction ID : 27 Begin time : Mon Mar 21 09:33:50 2016 Begin rpmdb : 443:a54a9441321f6ce52f0fd0af7efa6cd1a7c3154a End time : 09:33:53 2016 (3 seconds) End rpmdb : 443:3bb7a703c3c1a4fbceba46f67e5de5212d386b1c User : root Return-Code : Success Command Line : install coreutils Transaction performed with: Installed rpm-4.8.0-38.el6_6.x86_64 @updates Installed yum-3.2.29-60.el6.centos.noarch @anaconda-CentOS-201410241409.x86_64/6.6 Installed yum-plugin-fastestmirror-1.1.30-30.el6.noarch @anaconda-CentOS-201410241409.x86_64/6.6 Packages Altered: Updated coreutils-8.4-37.el6.x86_64 @base Update 8.4-37.el6_7.3.x86_64 @updates Updated coreutils-libs-8.4-37.el6.x86_64 @base Update 8.4-37.el6_7.3.x86_64 @updates history info ## Окатывает изменения сделанные во время установки с номером транзакции 27 $ yum history undo 27 Loaded plugins: fastestmirror Undoing transaction 27, from Mon Mar 21 10:12:40 2016 Updated coreutils-8.4-37.el6.x86_64 @base Update 8.4-37.el6_7.3.x86_64 @updates Updated coreutils-libs-8.4-37.el6.x86_64 @base Update 8.4-37.el6_7.3.x86_64 @updates Loading mirror speeds from cached hostfile * base: ******** * epel: ******** * extras: ******** * rpmforge: ******** * updates: ******** Resolving Dependencies --> Running transaction check ---> Package coreutils.x86_64 0:8.4-37.el6 will be a downgrade ---> Package coreutils.x86_64 0:8.4-37.el6_7.3 will be erased ---> Package coreutils-libs.x86_64 0:8.4-37.el6 will be a downgrade ---> Package coreutils-libs.x86_64 0:8.4-37.el6_7.3 will be erased --> Finished Dependency Resolution Dependencies Resolved ============================================================================ Package Arch Version Repository Size ============================================================================ Downgrading: coreutils x86_64 8.4-37.el6 base 3.0 M coreutils-libs x86_64 8.4-37.el6 base 50 k Transaction Summary ============================================================================ Downgrade 2 Package(s) Total download size: 3.1 M Is this ok [y/N]: y Downloading Packages: (1/2): coreutils-8.4-37.el6.x86_64.rpm | 3.0 MB 00:00 (2/2): coreutils-libs-8.4-37.el6.x86_64.rpm | 50 kB 00:00 ---------------------------------------------------------------------------- Total 5.7 MB/s | 3.1 MB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : coreutils-8.4-37.el6.x86_64 1/4 Installing : coreutils-libs-8.4-37.el6.x86_64 2/4 Cleanup : coreutils-8.4-37.el6_7.3.x86_64 3/4 Cleanup : coreutils-libs-8.4-37.el6_7.3.x86_64 4/4 Verifying : coreutils-libs-8.4-37.el6.x86_64 1/4 Verifying : coreutils-8.4-37.el6.x86_64 2/4 Verifying : coreutils-8.4-37.el6_7.3.x86_64 3/4 Verifying : coreutils-libs-8.4-37.el6_7.3.x86_64 4/4 Removed: coreutils.x86_64 0:8.4-37.el6_7.3 coreutils-libs.x86_64 0:8.4-37.el6_7.3 Installed: coreutils.x86_64 0:8.4-37.el6 coreutils-libs.x86_64 0:8.4-37.el6 Complete! |