Использование только функций, доступных в 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
).
Не анализировать ls
вывод . Прочитайте список файлов в массив и проверьте размер массива.
retry() {
while true; do
files=( *File*${JulianDate}.* )
(( ${#files[@]} >= 12 )) && break
sleep for some amount
done
do stuff with 12 or more files...
}
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 или более именами файлов или пока цикл не будет выполнен четыре раза. Он возвращает успех (ноль )или отказ (не -ноль )в зависимости от того, пришли ли файлы вовремя или нет.
Связанные: