Автоматически движущиеся файлы к каталогу, один за другим, и только когда целевая папка пуста

Обычно Ваши мысли - все в правильном направлении. Определенные ответы на Ваши вопросы:

  • "Я могу выполнить крон, который продвинет через rsync или SMB к полю NAS?"

    Да, абсолютно.

  • "Как я использовал бы rsync для выпадающего /home каталог на моем удаленном сервере? Действительно ли это легко?

    Да, вот команда, которую я использую. Проверьте rsync документы на объяснения:

    rsync -vrltpz --force --delete -e ssh you@yourserver.com:/home/ /backups/myserver
    
  • Существует ли руководство новичка?

    Многие, вот хорошая поваренная книга

  • Я могу сделать rsync от локальной машины?

    Да. Вы выполнили команду выше от Вашей локальной машины.

  • (Как Вы заставляете крон делать это)?

    Также не трудно. Использовать crontab отредактировать Вашу таблицу крона:

    $ crontab -e
    

    Редактор обнаружится. Введите что-то вроде этого для резервного копирования один раз в день:

    MAILTO=you@youremail.com
    @daily rsync -vrltpz --force --delete ... 
    

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

3
13.04.2017, 15:36
2 ответа

Вы хотите что-то вроде этого?

#!/usr/bin/env bash
## This is the target path, the directory
## you want to copy to.
target="some/path with/spaces";

## Find all files and folders in the current directory, sort
## them reverse alphabetically and iterate through them
find . -maxdepth 1 -type f | sort -r | while IFS= read -r file; do
    ## Set the counter back to 0 for each file
    counter=0;
    ## The counter will be 0 until the file is moved
    while [ $counter -eq 0 ]; do
      ## If the directory has no files
      if find "$target" -maxdepth 0 -empty | read; 
      then 
          ## Move the current file to $target and increment
          ## the counter.
          mv -v "$file" "$target" && counter=1; 
      else
          ## Uncomment the line below for debugging 
          # echo "Directory not empty: $(find "$target" -mindepth 1)"

          ## Wait for one second. This avoids spamming 
          ## the system with multiple requests.
          sleep 1; 
      fi;
    done;
done

Этот сценарий будет работать, пока все файлы не были скопированы. Это только скопирует файл в $target если цель пуста, таким образом, она зависнет навсегда, если другой процесс не удалит файлы, поскольку они входят.

Это повредится если Ваши файлы или $targetимя содержит новые строки (\n) но должен согласиться с пробелами и другими странными символами.

2
27.01.2020, 21:20
  • 1
    Миллион благодарностей! Уменьшенный для знания существует простой ответ для людей на OS X, который не имеет inotify. Только вещь была, я, могло казаться, не подавал ее путь назначения с пробелами в ней. (Испытанный выход из пути вручную и использование надлежащего возвращенного пути, скопированного и вставляемого от Терминала, но, могли делать глупую ошибку так или иначе, я предполагаю). Так или иначе я смог работать вокруг этого с символьной ссылкой. Отметьте другими: кардинально, после того как каталог получен к с символьной ссылкой, сценарий счастливо принимает все файлы, включая тех, которые имеют пробелы и причудливые символы. –  iceequal 11.09.2013, 18:16
  • 2
    @iceequal, там не должна быть без проблем с пробелами. Действительно ли это было $target это содержало пространство? Вы помещали его в кавычки как в моем примере? –  terdon♦ 11.09.2013, 18:34
  • 3
    Мысль Ваш комментарий должен просто, означала, что я абсолютно ошибался, но я протестировал его снова... просто подавление его к 'причуде OS X'. P.S., есть ли какой-либо способ 'отладить' этот сценарий? Это раньше работало красиво, но теперь это просто находится на 'сне', и я не могу выяснить, почему это не попытается переместить любые файлы... Lol. (Я трижды проверил, что я - cd'ed к правильному каталогу, и что внешняя программа захватывает и перемещает файлы, когда я поместил их в целевую папку вручную). –  iceequal 20.11.2013, 06:51
  • 4
    @iceequal, если путь назначения заключается в кавычки, Вы не должны выходить из пробелов (см. обновленный сценарий). Оба target=foo/bar\ baz и target="foo/bar baz" должен работать, но target="foo/bar\ baz" не будет. Если это зависает, который, вероятно, означает, что цель не пуста, возможно, существует скрытый файл? Попробовать ls -a "$target" проверять. Для отладки можно изменить сценарий, таким образом, он печатает файлы, он находит в цели, просто не прокомментируйте строку, которую я добавил под else, это распечатает любые файлы, найденные в цели. версия –  terdon♦ 20.11.2013, 14:08
  • 5
    я так или иначе пропустил уведомление о Вашем комментарии. Бум, который работает!Спасибо! –  iceequal 08.05.2014, 11:34

Простое использование решения inotify-wait от inotify-tools:

#!/bin/bash
SOURCE=$1
DEST=$2
(
IFS=$'\n'
for FILE in $(find "$SOURCE" -type f | sort -r); do
  mv "$FILE" "$DEST"
  inotifywait -e moved_from "$DEST"
done
)

Объяснение:

  • (IFS=$'\n' ...)

    Выполняет тело сценария в подоболочке где внутренний разделитель полей $IFS установлен на символ новой строки, позволив for цикл для обработки имен файлов с пробелами правильно. $'string' синтаксис делает bash интерпретируйте escape-последовательности в string, так $'\n' интерпретируется правильно как символ новой строки.

  • for FILE in $(find $SOURCE -type f | sort -r)

    Создает отсортированный список реверса файлов в $SOURCE и его подкаталоги и выполняют итерации через список одного файла во время, устанавливая значение $FILE в следующий файл, который будет перемещен.

  • mv "$FILE" "$DEST"

    Перемещает ток $FILE кому: $DEST каталог.

  • inotifywait -e moved_from "$DEST"

    Устанавливает inotify смотрите, который инициирован, когда файл перемещен из наблюдаемого каталога. Это заставит сценарий блокироваться в то время как $DEST каталог освобожден. Это принято это $DEST пусто, когда сценарий вызывается.

2
27.01.2020, 21:20
  • 1
    Хороший для intotify! Это повредится на именах файлов с пробелами все же. –  terdon♦ 09.09.2013, 18:07
  • 2
    @terdon Фиксированная обработка имен файлов с пробелами. –  Thomas Nyman 09.09.2013, 23:46

Теги

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