Файлы tar в Linux менее 3 месяцев назад с использованием даты в имени файла

eudyptula-boot довольно удобен для этого; его вводный пост в блоге содержит больше деталей, но в основном он позволяет загружать виртуальную машину, используя ядро, которое вы хотите проверить, и ваши существующие файловые системы (с помощью overlayfs). Таким образом, вы можете быстро проверить ядро без перезагрузки, и при этом у вас остается доступ ко всем вашим файлам.

Единственное требование к проверяемому ядру - поддержка overlayfs и 9p; их легко активировать в конфигурации ядра перед сборкой.

3
28.02.2016, 14:31
3 ответа

С этим форматом даты вы можете использовать порядок строк в awk , например:

files=( $(ls | awk -v d=$(date -d '4 months ago' +%Y%m%d_999.pdf) '$1<d {print;}') )
tar cvfz backup.tar.gz "${files[@]}"

Программа awk считывает входные строки и применяет к ним свои правила. В этом случае он сначала вызывается с переменной d , установленной как дата отсечения, преобразованная в имя файла. Затем для каждой строки он сравнивает первое слово ( $ 1 ) с датой отсечения ( d ) в алфавитном порядке, и там, где ввод находится перед клипом, он печатает линия (иначе нет).

Чтобы обрезать по месяцам, измените % d на 00 , чтобы исключить месяц четыре месяца назад, или 99 , чтобы включить месяц четыре. мотыльков назад.

2
27.01.2020, 21:18

Пожалуйста, проверьте этот сценарий в соответствии с вашими требованиями. Надеюсь, что это работает для вас. Измените его в соответствии с вашими требованиями

lines=`expr 0 + 0`
maxlines=`expr 0 + 100`
while [ 1 -le 5 ] ; do
     d=`date +%G%m%d`
     count=`ls -1 | grep $d |wc -l`
     c=`expr $count + 0`
     while [ $c -gt 0 ]; do
          file=`ls -1 | grep $d |tail -$c |head -1`
          searchFile=`grep $file tmp | head -1 | wc -l`
          searchFile=`expr $searchFile + 0`
          if [  $searchFile -eq 0 ]; then
               cp $file /home/avinash/f
               echo $file >>tmp
               lines=`expr $lines + 1`
          fi 
          c=`expr $c - 1`
     done     
     if [ $lines -gt $maxlines ]; then 
            k=`date +%G%m`
          grep $k tmp > t
          mv -f t tmp
          lines=`expr 0 + 0`
     fi     
done

Этот скрипт выберет только файлы на сегодняшнюю дату по времени сервера. Этот скрипт работает в бесконечном цикле.

Таким образом, всякий раз, когда в каталоге появляется новый файл, он проверяет имя файла, и если имя содержит сегодняшнюю дату, он помещает файл в каталог home / avinash / red , откуда его выбирает сервер PI. для чтения.

Измените имя папки по своему усмотрению. Теперь в папке / home / avinash вам нужно сохранить файл с именем temp , этот файл будет содержать только одно слово или любой символ, скажем привет . Использование temp состоит в том, чтобы собрать все имена файлов, которые сценарий уже перенес в папку PI. Таким образом, если скрипт передал файл, скажем, ABC_20110725.txt и DEF_20110725.txt , то tmp будет иметь содержимое

1
27.01.2020, 21:18

Вот один способ:

$ files=( $(d=$(date +'%Y%m' -d '4 months ago'); 
          for f in *.pdf; do [[ "${f:0:6}" -le "$d" ]] && 
                             printf '%s\n' "$f"; done;) )
$ tar cvzf backup.tgz "${files[@]}"
20140201_004.pdf
20150201_003.pdf

Объяснение

  • d = $ (date + '% Y% m' -d '4 месяца назад') : установите переменную $ d на желаемую дату.
  • для f в * .pdf; делать ... ; done : перебрать все файлы .pdf в каталоге, сохраняя каждый как $ f .
  • [["$ {f: 0: 6}" -le "$ d"]] : проверьте, меньше ли первые 6 символов имени файла чем или равно значению $ d .
  • && printf '% s \ n' "$ f"; done; : если да, распечатайте имя файла.
  • files = ($ (...)) : сохраните вывод вышеуказанного в массиве $ files .

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

for f in [0-9][0-9][0-9][0-9][0-9][0-9]*.pdf; do ...
1
27.01.2020, 21:18

Теги

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