Bash-скрипт для упаковки примерно 1 ГБ файлов в tar-архив

В дополнение к полезному ответу слоя b -я бы посоветовал никогда не использовать расширение greedy glob, если вы не уверены, существуют ли файлы того типа, который пытается расшириться.

Когда вы сделали это ниже, возможно, что файл (не имеет .shрасширения ), просто временный файл, содержащий некоторые вредоносные команды (, например.rm -rf *)которые могут быть выполнены (при условии, что у них есть права на выполнение)

source lib/*

Поэтому всегда выполняйте расширение глобуса с правильным набором границ, хотя в вашем случае вы можете просто зацикливаться только на *.shфайлах

for globFile in lib/*.sh; do
    [ -f "$globFile" ] || continue
    source "$globFile"
done

Здесь [ -f "$globFile" ] || continueпозаботится о выходе из цикла, если в текущей папке нет совпадений шаблона глобуса, т. е. эквивалент расширенных опций оболочки nullglobв оболочке bash.

0
12.11.2019, 06:46
1 ответ

Как насчет вложения второго цикла в каждый из циклов вашего каталога для отслеживания размера каждого файла перед его добавлением в файл tar? Вот схематический псевдо-код того, что я имею в виду:

max_size=$((1024*1024*1024))
total_size=0
for dir in $dirlist ; do
  for foo in $dir/*; do
    this_size="$(stat -c"%s" $foo)"
    if [ $(($total_size + $this_size)) -le $max_size ] ; then
      tar --append... $foo
      total_size="$(($total_size + $this_size))"
    else
      # start new tar file here
      tar -c... $foo
      total_size="$this_size"
    fi
  done
done
1
28.01.2020, 02:38

Теги

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