Сценарий Bash: я проверяю файлы на LS -1, я также хочу петлю, если нет файлов

Использование только функций, доступных в AIX или других системах POSIX и вряд ли больше:

find /usr/something/* /usr/something/.[!.]* /usr/something/..?* \
     -prune -type f -user antoine -exec zip -r /tmp/file.zip {} +

find рекурсивно переходит в подкаталоги. Чтобы этого избежать, -prune говорит ему не спускаться в каталоги, с которыми он сталкивается. Это бесполезно, если я запустил find / usr / something -type d -prune -o… , потому что тогда / usr / something будет пропущен. Поэтому я запускаю find для всех записей в этом каталоге, кроме . и .. .

Более простая идиома - переключиться на каталог и обработать начальный каталог . специально. Здесь он изменит результирующий архив, путь которого будет иметь вид ./ foo вместо usr / something / foo . Этот метод основан на том, что -name. соответствует только начальному каталогу, каждый второй встреченный файл будет иметь собственное имя.

cd /usr/something &&
find . ! -name . -prune -type f -user antoine -exec …

Обратите внимание, что zip может выполняться более одного раза, если список имен файлов слишком длинный для однократного вызова.Это нормально, потому что zip -r заменяет существующие файлы в архиве; если вы используете другой архиватор, старайтесь не вызывать его в режиме, в котором он создает новый архив (например, не используйте tar -c ).

0
06.01.2019, 15:03
2 ответа

Не анализировать lsвывод . Прочитайте список файлов в массив и проверьте размер массива.

retry() {
    while true; do
        files=( *File*${JulianDate}.* )
        (( ${#files[@]} >= 12 )) && break
        sleep for some amount
    done
    do stuff with 12 or more files...
}
3
28.01.2020, 02:15
waitforfiles () {
    n=0
    while [ "$n" -lt 4 ]; do
        set -- *File*$JulianDate.*
        [ "$#" -ge 12 ] && return 0
        sleep 300
        n=$(( n + 1 ))
    done

    return 1
}

if ! waitforfiles; then
    echo 'Not enough files arrived in time.' >&2
    exit 1
fi

# Do something here.

Не разбирайте вывод ls, это только для вас, чтобы просмотреть . Вместо этого используйте оболочку для сопоставления имен, которые вы хотите сопоставить, а затем подсчитайте количество совпадающих файлов. Оболочка дает вам это более или менее бесплатно (по сравнению с вызовом внешних утилит lsиwc).

Вышеуказанная функция будет бездействовать в течение 300 секунд и повторять попытку, пока шаблон не совпадет с 12 или более именами файлов или пока цикл не будет выполнен четыре раза. Он возвращает успех (ноль )или отказ (не -ноль )в зависимости от того, пришли ли файлы вовремя или нет.

Связанные:

3
28.01.2020, 02:15

Теги

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