Вы, вероятно, используете файл в стиле Windows и скопируете его на свой NAS. Вы должны преобразовать его в стиль Unix. Ссылка в Википедии на более подробное объяснение .
Некоторые редакторы имеют возможность сохранять файл в других форматах. Если ваш редактор не может этого сделать, вы, вероятно, можете использовать утилиту dos2unix
, доступную для большинства дистрибутивов Linux.
Если все вышеперечисленные варианты не помогают, этот Stackoverflow , вероятно, может вам помочь.
Отклоняясь от наблюдения Жиля о том, что ваши имена файлов сортируются лексически, вы могли бы использовать zsh
для создания файла фильтра для rsync:
cut_log=A0000096.LOG zsh -c 'logfilter() { ! [[ "$REPLY" < "$cut_log" ]] }; print -l A*.LOG(+logfilter)' >.exclude_file
rsync A* --exclude-from=.exclude_file user@remoteHost:/somedir/
rm.exclude_file
Конечно, вы можете сделать все это изначально в zsh, но я показываю, как расширить ваш сценарий bash с помощью полезной функции zsh. Эта функция называется "Glob Qualifier" и описана в разделах eString
и +cmd
. Он запрашивает расширение A*.LOG
, отфильтрованное путем прохождения каждого кандидата через заданную функцию. Параметр функции называется REPLY
, поэтому мы сравниваем его лексически со значением $cut_log
, чтобы определить включение или исключение в результирующий список.
Вышеприведенное предполагает, что код выполняется в каталоге, содержащем файлы журналов, так что rsync
находит их, и чтобы zsh
находил их.
Это позволяет легко провести сухой -прогон, проверив .exclude_file
перед выполнением команды rsync
.
Если вы обнаружите, что слишком много файлов для , включите в команду -строку (так, что команда завершится ошибкой из-за слишком большого количества аргументов ), но их недостаточно исключить файлы, вы можете инвертировать логику и указать rsync
на --include-from
файл, а затем переключить логику logfilter
для удаления инверсии(!
).