Bash: Как создать постоянные замещающие строки в командах Bash?

В вашем вопросе не говорится, откуда берутся предыдущие заведомо хорошие значения. Я предполагаю, что у вас есть дерево, параллельное дереву содержимого , которое называется ../ oldcontent . Подгоните под себя:

#!/bin/bash

echo "Checking directories for proper extensions"

for d in documents media pictures other
do
    nfc=$(find content/$d -type f | wc -l)
    ofc=$(find ../oldcontent/$d -type f | wc -l)
    if [ $nfc -eq $ofc ]
    then
         echo The "$d" directory has as many files as before.
    elif [ $nfc -lt $ofc ]
    then
         echo There are fewer files in the content directory than before.
    else
         echo There are more files in the content directory than before.
    fi
done

Этот код намного короче, потому что он не пытается давать разные команды find для каждого цикла. Если вам это действительно нужно, вы можете использовать ассоциативный массив для объединения имен каталогов и найти аргументы:

declare -A dirs=(
    [documents]="-name \*.txt -o -name \*.doc -o -name \*.docx" 
    [media]="-name \*.gif"
    [pictures]="-name \*.jpg -o -name \*.jpeg"
    [other]=""
)

Тогда цикл for станет:

for d in "${!dirs[@]}"
do
    nfc=$(find content/$d -type f ${dirs[$d]} | wc -l)
    ofc=$(find ../oldcontent/$d -type f ${dirs[$d]} | wc -l)

...

Однако это работает только в Bash 4 и выше. В Bash 3 есть менее мощный механизм ассоциативных массивов, но он в значительной степени нарушен конструкцией. Если у вас под рукой нет Bash 4, я бы посоветовал вам переключиться на что-то вроде Perl, Python или Ruby, а не пытаться использовать ассоциативные массивы Bash 3 для чего-то вроде этого.

Помните, что это не означает, что дерево содержимого содержит те же файлы, что и ../ oldcontent , только то, что в каждом подкаталоге есть одинаковое количество файлов. Если вы пытаетесь обнаружить изменения в файлах в каждом дереве, вам необходимо использовать rsync или мое решение « MD5 a directory » здесь, на Unix.SE.

1
16.10.2016, 11:10
3 ответа

Для этого я бы написал функцию:

s() {
    ssh "really-really-long-hostname$1"
}

Затем назовите его так:

s 10037

Дополнительная литература:

1
29.04.2021, 00:09

Отредактируйте файл ~ / .ssh / config и добавьте такие записи для каждого хоста:

Host myhostN
    HostName    really-really-long-hostname100N

Установите права доступа к этому файлу на 0600:

chmod 0600 ~/.ssh/config

Затем вы сможете использовать myhostN с ssh связанными командами ( sftp , scp и т. Д.) Вместо действительно-действительно-длинное-имя-хоста100N .

1
29.04.2021, 00:09

Я решил это так: Отредактируйте локальный файл / etc / hosts . Добавьте IP и имя вроде этого

216.58.211.14    my.google0
216.58.211.3     mygoogle1

.. в оболочке

ping mygoogle1

ssh my.google0

будет работать на локальной машине

Другой способ - использовать псевдонимы.

Добавьте в ~ / .bashrc

alias ssh1='ssh -2 somehost.foo -l bar'

в следующий раз, когда bash будет запущен, вы подключитесь, набрав ssh1 .

0
29.04.2021, 00:09

Теги

Похожие вопросы