LINUX.ORG.RU

Архивирование подкаталогов

 ,


0

1

Всем доброго времени суток!

В прошлый раз когда спрашивал про bash мне показали интересный приём как спрарсить список файлов в переменную. А есть другие способы это сделать?

В качестве примера скрипт, который бекапит каждый подкаталог в отдельный архив.

#!/bin/bash

DIR="/path/to/"

mkfifo /tmp/files.tmp
trap "rm '/tmp/files.tmp'" EXIT

find "$DIR" -mindepth 1 -maxdepth 2 -type d ! -name "." | while read subdir; do
    if [[ -d "$subdir" && "$(ls -A "$subdir")" ]]; then
        name=`echo "$subdir" | sed 's|.*/||'`
        files=()
        find "$subdir" -maxdepth 1 -type f -not -name *.directory > /tmp/files.tmp &
        while read file; do
            files+=("$file")
        done < /tmp/files.tmp
        tar -cvf "$name" "${files[@]}"
    fi
done

Ответ на: комментарий от vodz

Архивирование скорее как пример. Операция может быть и другая.

hanharr
() автор топика
Ответ на: комментарий от anonymous

Так как у него все равно дальше идёт

if [[ -d "$subdir" && ...
, то проще вообще сделать через
for file in .* * ; do
done

vodz ★★★★★
()
Ответ на: комментарий от vodz

Ну это вообще было про такие конструкции, так-то да.

anonymous
()
Ответ на: комментарий от anonymous

В первом варианте для while порождается ещё субшелл.

В обоих вариантах будет два процесса и pipe. Разница только в каком из процессов выполнятся тело цикла: главного или второго для cmd | тело и тело < <$(cmd)

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от hanharr

От fifo никак нельзя уйти в подобных вещах?

Ну вы же должны понимать, что способ получить вывод программы для чтения в своей в юниксе делается только либо через pipe либо через (временный) файл. fifo - это именной pipe. Конструкция <$(cmd) на самом деле - именной pipe в /proc/pid/fd/N

vodz ★★★★★
()
Ответ на: комментарий от vodz

В большинстве случаев цикл лучше оставлять тут же.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.