Перечислить временные файлы по числовому значению, имеющему число больше заданного постоянно изменяющегося имени файла

У меня есть каталог, постоянно изменяющий имена файлов (по числовому значению), перечисленные как:

-rw-rw----. 1 root root 10493952 May 7 10:39 A0000000.LOG -rw-rw----. 1 root root 10493952 May 7 08:38 A0000001.LOG -rw-rw----. 1 root root 10493952 May 7 08:38 A0000002.LOG ... ... -rw-rw----. 1 root root 10493952 May 7 08:38 A0000582.LOG ... and so on... 

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

Скажем, приложение выдает файл A0000096.LOG . И я, если увижу A0000097.LOG , также A0000097.LOG , я бы ::

 rsync A* --exclude A0000096.LOG --exclude A0000097.LOG user@remoteHost:/somedir/ 
  • Следует отметить:

    • Приложение запускает различное имя файла для работы rsync cron каждый час. В этом примере имя файла A0000096.LOG

    • Файлы, имеющие более высокое числовое значение, чем имя файла вывода App ( A0000096.LOG в приведенном выше примере), могут иметь A0000096.LOG же дату создания / время, что и имя выходного файла приложения

    • К моменту запуска rsync выходное имя файла приложения может иметь более позднюю измененную дату / метку времени, чем файлы с более высоким численным значением.

    • Возможно, существует вероятность того, что файлы с большими численными значениями не будут созданы или могут быть созданы более чем 1 (может быть от 10 до 20)

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

Любая помощь приветствуется.

3 Solutions collect form web for “Перечислить временные файлы по числовому значению, имеющему число больше заданного постоянно изменяющегося имени файла”

Если я правильно понял вопрос, вы хотите rsync все файлы в диапазоне от A0000000 до A0000095 . Ну, тогда не говори A* ; используйте список положительных подстановочных знаков (например, шаблоны расширения глобусов или файлов), которые генерируют имена файлов, которые вы хотите, а не идентифицируете те, которые вы хотите исключить. Сделайте это, разложив диапазон на поддиапазоны:

  Subrange Wildcard A0000000-A0000089 A00000[0-8][0-9] A0000090-A0000095 A000009[0-5] 

Так вы сказали бы

 rsync A00000[0-8][0-9] A000009[0-5] user@remoteHost:/somedir/ 

В случае, если у вас возникли проблемы с обобщением этого подхода из одного примера, рассмотрим 97169.

  Subrange Wildcard A0000000-A0089999 A00[0-8][0-9][0-9][0-9][0-9] A0090000-A0096999 A009[0-6][0-9][0-9][0-9] A0097000-A0097099 A00970[0-9][0-9] A0097100-A0097159 A00971[0-5][0-9] A0097160-A0097168 A009716[0-8] 

Можно предположить, что некоторые из этих подстановочных знаков не будут соответствовать существующим файлам. В этом случае сделайте

 shopt -s nullglob 

чтобы заставить оболочку идти вперед и запускать команду rsync с игнорируемыми подстановочными знаками (т. е. расширенными до нуля).

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

Вы можете сделать это, построив строку, содержащую имена файлов, разделенные символами новой строки, и используя подстановку строк, чтобы удалить конец строки, а затем полагаться на некотируемое расширение, чтобы вернуть усеченную строку обратно в список. Я предполагаю, что в именах файлов нет новых строк и что ваша оболочка bash или ksh (с простой sh, вам нужно использовать позиционные параметры вместо именованного массива).

 nl=$'\n' # newline, we use it as a separator cut_from=A0000096.LOG log_files=(A???????.LOG) set -f; IFS="$nl" # disable wildcard expansion and set the word separator to newline only log_files="$nl${log_files[*]}$nl" # turn the array into a string with newlines separating elements log_files=(${log_files%"$nl$cut_from$nl"}) # remove elements from $cut_from onwards and split the string into an array unset IFS; set +f rsnyc -a "${log_files[@]}" … elsewhere:/some/dir 

Отвечая на мой вопрос:

  CUT_LOG=A0000096.LOG #Actually, Logic goes here to determine name of file. LISTLOG=`ls -1 /Source_Dir/A*.LOG | sed "/$CUT_LOG/,$ d"` # Create a list that has only relevant entries # sed deletes all lines starting from pattern matching line till the end.(here pattern=CUT_LOG) rsync -a `echo "${LISTLOG[@]}"` user@remoteHost:/somedir/ # This would be faster than using loop (explained next) 

или используя цикл

  for line in `echo "${LISTLOG[@]}"`; do # Recursively loop through the array and rsync each entry rsync -a $line user@remoteHost:/somedir/ done 
  • rsync не сохраняет отметку времени после сбоя
  • rsync с различными портами ssh
  • rsync претендует на разные файлы, но diff нет?
  • пользователь root отказал в доступе к .gvfs в rsnapshot?
  • Умнее filetransfers чем rsync?
  • BackupPC не может завершить резервное копирование
  • Синхронизировать дерево каталогов с дедупликацией?
  • Rsync не пропускает существующие файлы
  • Есть ли какой-либо параметр rsync для показа в конце внесенных изменений?
  • Файлы rsync с разрешениями apache по ssh
  • Удалите строки текста, которые заканчиваются на "/"
  • Linux и Unix - лучшая ОС в мире.