BASH: итерация по каталогу, исключая определенные подкаталоги на основе ключевых слов - PullRequest
0 голосов
/ 21 февраля 2012

Я пытаюсь создать простой скрипт резервного копирования, который, помимо прочего, скопирует мой профиль Firefox, исключая любой элемент кэша или папку в этом профиле.

Это на моем основанном на debian crunchbangsystem.

Это звучит достаточно просто, но я новичок в bash-скриптинге, и то, что я придумала до сих пор, настолько неэластично и громоздко, что я бы хотела получить некоторую информацию.

Вот что у меня есть:

#!/bin/bash

for f in /home/my_name/.mozilla/firefox/*.default/*
do
echo "$f level 1"

if [[ "$f" != "Cache" ]]
then
    if [ -d $f ]
    then
        for g in $f/?
        do
           echo "$g level 2"
            for h in $g/?
            do
            echo "$h level 3"
                for i in $h/?
                do
                echo "$i level 4"
                for j in $i/?
                do
                echo "$j level 5"
                done
            done
        done
    done 
    fi
fi
done

Эхо есть, как вы уже догадались, для проверки ошибок.Они должны быть заменены операторами cp.

Одна проблема, которую я вижу, состоит в том, что это недостаточно гибко: если есть каталоги дальше, чем на 5, они не будут включены.Если я расширяю сценарий, чтобы включить их, я просто перенесу проблему на один шаг.

Другая проблема - это проблема, которую я вижу в выводе сценария в настоящее время:

/home/my_name/.mozilla/firefox/gibberish.default/OfflineCache/?/?/? level 4

Я не знаюЯ не знаю, почему появляется эта строка, но я верю, что она не должна.

Так что ... есть какие-то подсказки, которые помогут мне в моем пути?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Лучше оставить эту работу на rsync

rsync -avh --progress --exclude='*Cache/' ~/.mozilla/firefox/ /path/to/your/backup/location/
1 голос
/ 21 февраля 2012

Стандартным инструментом для поиска структуры каталогов является find.

find /home/my_name/.mozilla/firefox/*.default/* -name Cache -prune -o -type f -exec echo cp {} dest \;

Извлеките echo, как только увидите то, что вам нравится.Вы можете поискать дополнительные примеры в Google, возможно, с xargs.Если у вашего cp есть опция -t, взгляните также на \+ в документации find -exec.

...