LINUX.ORG.RU

Есть одна команда...

 


0

1

...и она порождает два вопроса.

Сабж:

tar -tvf *.tar|cut -c32-41|grep -n ""
На сколько надежен метод получения даты? Зависит ли он от ширины экрана/версии tar/фазы луны? (или это незыблимый POSIX-стандарт?) Я понимаю, что можно выбрать дату по номеру поля; или просто грепнуть, с вырезанием из вывода точного соответствия шаблону. В данной же постановке вопрос носит сугубо теоретический интерес. Пример вывода у меня
1:2013-11-06
2:2006-03-31
3:2013-01-08
4:2010-06-19

Вообще задача, в, частном случае, выбрать из списка файлов ту или иную строку и с ней работать. Если файл достаточно старый (допустим старше семи дней), то удалить. Если файла с сегодняшней датой нет, добавить такой.

Вот еще что. Я пока мыслил в направлении получения номера строки. А надо ли мне оно? Очевидным выглядит решение:

0 из вышеполученного грепа cut'нуть номер строки

1 повторять греп по номеру строки и..

2 ..из полученной строки cut'ать значение имени

Но грепанье по дате сначала чтобы получить номер строки, а потом грепанье по номеру чтобы получить имя выглядит каким-то не сильно изящным. Тем более это все надо будет повторять при каждом обращении к архиву(?). А оно будет неоднократным, ведь нужно найти файл с последней датой, сравнить его с сегодняшней. Потом найти самый старый и удалить. Я кажется что-то делаю не так V_v?

Собсно, этот скриптик задумывался как повод что-нибудь новое узнать о консольке. Но я почему-то топчусь на уже знакомых инструментах. Наверное в этом проблема?



Последнее исправление: Csandriel (всего исправлений: 5)
Ответ на: комментарий от Eddy_Em

Предлагаешь зазубрить over 130K слов? Не у всех такая крутая память.

2ТС: У меня как-то не так работает:

1:2014-02-07
2:56 2014-02
3:45 2014-02
4:04 2014-02

Lavos ★★★★★
()

а цель то какая?

здесь_и_сейчас али универсальное_bullit_proff_на_баше_унд_командочкахИЗnix либо что?

qulinxao ★★☆
()
Ответ на: комментарий от Eddy_Em

Ты русский когда начал изучать?

просто в последнее время интернет сильно засран английским. Оно так сказать влияет.

Csandriel
() автор топика
Ответ на: комментарий от qulinxao

а цель то какая?

Скриптик будет при запуске бекапить тот документ, с которым работает. Но на самом деле это косвенная цель. Основная, то попердолиться с консолькой, в образовательных целях ^_^

Csandriel
() автор топика
Ответ на: комментарий от Csandriel

Конечно, надежней: awk выведет тебе нужное поле, а cut тупо по символам обрезает. А до даты есть поля переменной длины (права и размер).

Eddy_Em ☆☆☆☆☆
()

По символам делать категорически нельзя! Подумай, например, что будет если кто-то засунет тебе туда 100500й год.

Reset ★★★★★
()

На сколько надежен метод получения даты? Зависит ли он от ширины экрана/версии tar/фазы луны? (или это незыблимый POSIX-стандарт?)

You're doing it wrong. Для таких целей надо использовать нормальные скриптовые языки, работающие через нормальные библиотеки. А доверять выхлопу команд можно только либо если они чётко стандартизированы, либо если они намисаны тобой лично.

$ yaourt -S libtar
Пароль: 
разрешение зависимостей...
проверка на взаимную несовместимость...

Пакеты (1):

Название      Новая версия  Изменение размера  Необходимо загрузить

extra/libtar  1.2.20-1      0,08 MiB                       0,03 MiB

Будет загружено: 0,03 MiB
Будет установлено: 0,08 MiB

:: Приступить к установке? [Y/n] 
:: Получение пакетов ...
 libtar-1.2.20-1-i686                                        34,6 KiB   279K/s 00:00 
(1/1) проверка ключей
(1/1) проверяется целостность пакета
(1/1) загрузка файлов пакета
(1/1) проверка конфликтов файлов
(1/1) проверяется доступное место
(1/1) установка libtar
$ gem install --user-install tarruby
Building native extensions.  This could take a while...
Successfully installed tarruby-0.1.5
Parsing documentation for tarruby-0.1.5
Installing ri documentation for tarruby-0.1.5
Done installing documentation for tarruby after 1 seconds
1 gem installed
$ xzcat /var/cache/pacman/pkg/xorg-server-1.15.0-5-i686.pkg.tar.xz > /tmp/example.tar
$ mcedit /tmp/1.rb
$ cat /tmp/1.rb
require 'tarruby'
Tar.open('/tmp/example.tar', File::RDONLY) do |tar|
    tar.each do |item|
        puts "#{item.mtime} #{item.pathname}"
    end
end
$ ruby /tmp/1.rb
2014-01-09 17:33:45 +0800 .PKGINFO
2014-01-09 17:33:46 +0800 .MTREE
2014-01-09 17:33:45 +0800 etc/
2014-01-09 17:33:45 +0800 etc/X11/
2014-01-09 17:33:45 +0800 etc/X11/xorg.conf.d/
2014-01-09 17:33:44 +0800 etc/X11/xorg.conf.d/10-evdev.conf
2014-01-09 17:33:45 +0800 etc/X11/xorg.conf.d/10-quirks.conf
2014-01-09 17:33:45 +0800 usr/
.
.
.
anonymous
()

Lavos Короче, ясно что вывод tar может быть с табуляторами. А у тебя какой дистриб/версия?

Eddy_Em но у меня все поля фиксированного размера. Вот например

user@host:~> tar -tvf *.tar
lrwxrwxrwx root/root         0 2013-11-06 21:16 etc/X11/xdm/authdir -> /var/lib/xdm/authdir
-rwxr-xr-x root/root       816 2006-03-31 12:38 etc/X11/xdm/GiveDevices
-rw-r--r-- root/root     14814 2013-01-08 14:01 etc/X11/xdm/Keyboard.map
-rwxr-xr-x root/root      1545 2010-06-19 15:36 etc/X11/xdm/keytable
-rw-r--r-- root/root       965 2003-08-29 16:35 etc/X11/xdm/README.security
-rw-r--r-- root/root      2077 2003-08-29 16:35 etc/X11/xdm/README.SuSE
-rwxr-xr-x root/root      3513 2013-09-16 14:33 etc/X11/xdm/RunChooser
Собственно, мне это покзалось шикарным, по учтивости, решением. Поэтому и удивился, поэтому и возник вопрос.

Csandriel
() автор топика
Ответ на: комментарий от Csandriel

А если будет табуляция вместо пробелов?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Csandriel

А если у вас там будет большой размер или длинное имя пользователя, как будет выглядеть вывод?

А awk изучайте, там можно будет разом обрабатывать весь список файлов в архиве, не делая всяких номеров строк и многократных grep'ов.

mky ★★★★★
()
Ответ на: комментарий от Reset

Подумай, например, что будет если кто-то засунет тебе туда 100500й год.

Мне к тому времени будет все равно ^_^

Csandriel
() автор топика
Ответ на: комментарий от Reset

Ну это был типа юмор. Люблю загробную тему.

Ну в общем вполне убедился, что возможности grep/cut не соответствуют этой задаче. Подозревал, что пора расширять инструментарий. Не знал только в какую сторону. Удивился было, что никто не посоветовал sed. Погуглил и понял почему: он ориентирован на работу с отдельными символами, awk же работает с полями, что в моем случае и нужно.

Анону отдельное спасибо за вербование в руби, но вообще-то исповедую минимализм. Хотелось решить вопрос привлекая только более-менее штатные средства консоли. Руби/Питоны/Перлы к ним не отношу. Это уже пушкой по воробьям.

Всем пасибки ^_^

Csandriel
() автор топика

На сколько надежен метод получения даты? Зависит ли он от ширины экрана/версии tar/фазы луны? (или это незыблимый POSIX-стандарт?)

это не метод, а говно. Уж лучше sed/awk юзать, и фильтровать поле.

тут я вижу два решения:

1. получить всю дату и распарсить её (быстро но не очень надёжно)

2. распаковать файл в /tmp/, а уж там его дату сравнивать. Это ИМХО надёжнее.

Ну и как альтернатива — вообще не парсить дату(обрати внимание на --update, оно само дату парсит)

emulek
()
Ответ на: комментарий от Csandriel

Походу вывод tar с табуляторами?

несколько пробельных символов при парсинге считаются эквивалентными одному пробелу. Обычно используют ERE/PCRE \s+

сдвиг такой серьезный?

так делают только чудаки. Ещё можно перед увольнением сделать, что-бы про тебя вспомнили.

emulek
()
Ответ на: комментарий от Reset

Подумай, например, что будет если кто-то засунет тебе туда 100500й год.

это не страшно. СТРАШНО, когда архив сделает не vasya, а bob.

emulek
()
Ответ на: комментарий от Csandriel

Погуглил и понял почему: он ориентирован на работу с отдельными символами, awk же работает с полями, что в моем случае и нужно.

sed тоже поля умеет, но об этом мало кто знает.

$ tar -tvvf wc.tar |sed -r 's/^(\S+\s+){4}(\S+).*/\2/'
09:31

emulek
()
Ответ на: комментарий от emulek

обрати внимание на --update

Буду иметь в виду. Тамщета я пока ман tar'a толком не смотрел. Ход не дошел, так сказать. Но в архиве будет несколько файлов. Сейчас думаю, - 7 штук. При добавлении нового самый старый удаляется.

Csandriel
() автор топика
Ответ на: комментарий от Csandriel

Сейчас думаю, - 7 штук. При добавлении нового самый старый удаляется.

это невозможно. Можно добавить два файла с одним именем(ЕМНИП после этого можно даже стары извлечь как-то, а не только последний). --update так и делает, т.е. добавляет файлы которые новые.

PS: update/append не имеют смысла с упакованными архивами и с stdin. Делить на ноль нельзя.

emulek
()
Ответ на: комментарий от emulek

это невозможно. Можно добавить два файла с одним именем

Я, наверное, несколько мутно изъяснился. Имена для версий файла будут генериться, в соответствии с текущей датой.

Csandriel
() автор топика
Ответ на: комментарий от Csandriel

Я, наверное, несколько мутно изъяснился. Имена для версий файла будут генериться, в соответствии с текущей датой.

тогда не трахай мозги окружающим, и парси только имя файла. Т.е. используй просто tar --list, БЕЗ --verbose.

Hint: получай дату командой stat -c%Y имя_файла, тогда будет достаточно отпилить расширение от имени (.tar.bz2 например), и получишь дату в виде числа, которое можешь прямо так сравнивать в bash'е(он умеет работать с целыми).

Ещё вариант: создать отдельный список с датами, это ИМХО самое надёжное, т.к. формат тут только от тебя зависит(а значит неизменен).

emulek
()
Ответ на: комментарий от emulek

тогда не трахай мозги окружающим, и парси только имя файла

Были мысли, что что-то лишнее горожу. Но с другой стороны, если не цепляться за имена, то функция будет иметь большую функциональность. Она сможет быть использована не только для некоего жесткого формата имен. Чем меньше зависимостей, тем больше места для маневра. Может быть в будущем еще что-нибудь придется так по архивам-самокатам держать, чтобы иметь несколько версий. Да и в такой постановке вопрос стоит более кучеряво, интересно. «Излишество» здесь не ущерб, так как задача учебная, процесс ценен сам по себе.

Спасибо вообще за спойлеры. Однако пора бы мне практикой заняться. А то я как тот птерадактель

нам бы кодить, а мы все планируем ©

Csandriel
() автор топика
Ответ на: комментарий от Csandriel

«Излишество» здесь не ущерб, так как задача учебная, процесс ценен сам по себе.

ну ты наступил на грабли, и получил полбу. Теперь делай выводы.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.