Копирование файлов и подпапок без -r

Поскольку у меня больше нет этой проблемы, я хотел бы поделиться своим решением:

Я демонизировал скрипт Python. {{ 1}} Это позволило мне открыть последовательное соединение при запуске скрипта, а затем читать данные последовательного порта каждые десять секунд.

С тех пор никаких перерасходов.

Код сценария здесь, на GitHub

0
10.03.2018, 18:03
1 ответ

Я не совсем понимаю, почему вы не можете просто использовать cp -rили rsync -aдля этого, если вы явно не хотите сгладить структуру каталогов, но неважно.

Вы много делаете, чтобы получить путь к подкаталогам:cdв каталог, pwdк файлу, а затем прочитать этот файл в переменную. Вместо этого вы можете просто использовать, например.BUrout="$PWD/backup"($PWDсодержит путь к текущему рабочему каталогу ).

Вы никогда не будете обрабатывать какие-либо файлы, потому что ваш цикл проходит по имени каталога. То, что вы хотите, вероятно, for i in "$r"/*; doи аналогично во втором цикле.

Всегда двойные кавычки для расширений переменных! Например.if [ "$i" = "$r" ](обратите внимание также на одинарную =, а не на двойную ). См. как " Почему мой сценарий оболочки блокируется пробелами или другими специальными символами? ", так и " Последствия для безопасности, если забыли заключить переменную в кавычки в оболочках bash/POSIX "

В вашем скрипте не должно быть ни одного cd. Скрипты, которые входят в каталоги и выходят из них, действительно трудно отлаживать.

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

Могу ли я предложить что-то вроде этого, в котором по-прежнему используется та же логика циклов и в основном те же тесты, что и в вашем коде, но без вызовов cdи без необходимости слишком много возиться с именами каталогов:

#!/bin/sh

source="$1"
dest="$2"

mkdir -p "$dest"  # creates destination directory if not already exists

for name in "$source"/*; do
    if [ -f "$name" ]; then
        cp "$name" "$dest"
    elif [ -d "$name" ]; then
        for name2 in "$name"/*; do
            if [ -f "$name2" ]; then
                cp "$name2" "$dest"
            fi
        done
    fi
done

Или, используя сокращенный -синтаксис, который нравится некоторым людям:

#!/bin/sh

source="$1"
dest="$2"

mkdir -p "$dest"  # creates destination directory if not already exists

for name in "$source"/*; do
    [   -f "$name" ] && { cp "$name" "$dest"; continue; }
    [ ! -d "$name" ] && continue
    for name2 in "$name"/*; do
        [ -f "$name2" ] && cp "$name2" "$dest"
    done
done

Этот сценарий принимает два аргумента: исходный каталог и целевой/целевой каталог:

$./script mydir some_new_backup_dir

Не предпринимается никаких попыток проверить, не перезапишет ли какая-либо из команд cpсуществующий файл в целевом каталоге.

Также обратите внимание, что оба этих скрипта являются /bin/shскриптами. Они не используют ничего, характерного для оболочки bash.


Предполагая, что целевой каталог существует, это более или менее эквивалентно

find source_dir -maxdepth 2 -type f -exec cp {} target_dir ';'
2
28.01.2020, 02:32

Теги

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