Файл .sh для подсчета количества файлов

Друзья,

У меня есть маленький основной сценарий оболочки, который архивирует файлы в каталоге и подкаталоге. Однако я должен добавить только в противоречии с zip определенное число файлов), например, 50 файлов. Я не могу выполнить, советуйте. См. ниже мой сценарий.

#!/bin/bash
BASEDIR=/home/tmp
cd "${BASEDIR}"
pwd

for i in `find .  -name *.jpg -type f -print -mtime +30`
do
  zip ${i%.*} $i
  echo "Process Completed"
done

Советуйте? Большое спасибо за Вашу помощь.

1
задан 9 September 2018 в 20:56

1 ответ

Существуют вещи пары обратиться:

  • не используйте обратные галочки; $(...) обычно предпочитается в наше время тем более, что они обрабатывают вложенное заключение в кавычки. Не проблема здесь, но знать об этом
  • find должен использоваться в сочетании с while цикл для сложной обработки имен файлов. Цикл с условием продолжения также помогает подражать C-стилю для цикла, и на самом деле это - общее понятие в программировании этого, можно реализовать то же поведение в любом цикле.
  • использовать -u флаг для обновления, как zip -u zipfile.zip "$current_file", если Вы добавляете к существующему zip-файлу

Таким образом Ваш сценарий лучше записан как

#!/bin/bash
# using capitals for variable names
# can be confusing and interfere with env
# or shell variables
basedir=/home/tmp
cd "${basedir}"
# You can use variable instead of pwd command
printf "Current working directory:%s\n" "$PWD"

counter=0    
# pipelines can be broken to multiple lines
find .  -name '*.jpg' -type f -print0 -mtime +30 |
while IFS= read -r f_name; do
    counter=$((counter+1))
    zip u ${i%.*} "$f_name"
    # This is where you check for number of files processed
    if [ "$counter" -eq 50 ]; then
        break
    fi
done

Если это является слишком подробным и длинным, у нас может быть немного забавы с find и -exec флаг, но проблема - то, что у нас не может быть совместно используемой переменной между -exec вызовы. Там нос мы можем использовать временный файл. Мы также должны так или иначе остановиться find от вызова нашего -exec обработайте по всем файлам, больше, чем предел, таким образом, мы можем уничтожить родительский процесс оболочки, указанной $PPID переменная.

cd "$basedir"
find -type f -name '*.jpg' -mtime +30  -exec bash -c '
    f=/tmp/zip.counter; 
    [ -e "$f" ] && c=$(cat /tmp/zip.counter);
    c=$((c+1));
    [ "$c" -ge 50 ] && kill $(awk "/^Pid:/ {print $2}");
    zip u ${i%.*} "$1";
    echo "$c" > "$f"' sh {} \; && rm /tmp/zip.counter

Конечно, это решение не очень практично и возможно менее читаемо, чем то с while цикл. Этот бит только для забавы.

2
ответ дан 7 December 2019 в 13:21

Другие вопросы по тегам:

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