Как создать файлы с переменными названиями...

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

chelovekot
Сообщения: 11
ОС: Fedora 21 (GNOME 3.14)

Как создать файлы с переменными названиями...

Сообщение chelovekot » 10.11.2014 19:06

Задача: хочу сделать горячую клавишу для скриншотов, чтобы они сохранялись автоматически в определённую мной папку и с определёнными названиями (завязанными на время, чтобы легче было потом отыскать).

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

Код: Выделить всё

gnome-screenshot -f /путь/к/файлу/с/переменным/оригинальным/названием/


Хочется, чтобы название было такого плана: скриншот_$дата_$время.png. Название должно быть оригинальным и уникальным, чтобы не было затирания предыдущих снимков...

Сразу говорю, гуглил, но, видимо, ищу не с тем поисковым запросом, ибо найти ничего подходящего не смог по запросу. :wacko:


P.S. Нашёл более простое и довольно-таки оригинальное решение :rolleyes:: в настройках клавиатуры Backspace'ом отключаете горячую клавишу на скриншот и создаёте свою комбинацию c командой вида gnome-screenshot /путь/к/папке/для/ваших/скриншотов, назначаете на эту команду клавишу Print Screen и всё. Теперь все ваши скриншоты будут храниться в той папке, в которой хотите. Но, перед этим (или после этого), нужно обязательно указать папку file:///путь/к/папке/для/ваших/скриншотов/ в dconf-editor'e в параметре "auto-save-directory" (находится через поиск в dconf-editor'e (или org -> gnome-screenshot); в параметре "last-save-directory" лучше тоже указать тот же путь, тогда его не придётся всё время указывать, если скриншот будет сделан в интерактивном режиме).
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8084
Статус: Маньяк
ОС: Arch, CentOS, Ubuntu

Re: Как создать файлы с переменными названиями...

Сообщение serzh-z » 10.11.2014 19:18

gnome-screenshot -f ~/Pictures/$(date +screenshot_%Y-%m-%d_%T.png)

Что. собственно, в GNOME3 и так делает по умолчанию:

$ ls ~/Pictures
Screenshot from 2014-10-13 16:50:31.png Screenshot from 2014-10-13 16:53:21.png Screenshot from 2014-10-14 19:12:30.png Screenshot from 2014-10-16 12:26:41.png Screenshot from 2014-11-10 01:35:22.png
Scio me nihil scire.
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 273
ОС: OpenBSD

Re: Как создать файлы с переменными названиями...

Сообщение nerve » 10.11.2014 19:20

Код: Выделить всё

#!/bin/bash
NAME=`date +"%m-%d-%y_%T"`
gnome-screenshot -f /path/picture_$NAME
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как создать файлы с переменными названиями...

Сообщение Bizdelnick » 10.11.2014 19:21

gnome-screenshot -f /путь/к/файлу/`date +%Y-%m-%d-%T`.png
man date

P. S. Работает только в шелле.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

chelovekot
Сообщения: 11
ОС: Fedora 21 (GNOME 3.14)

Re: Как создать файлы с переменными названиями...

Сообщение chelovekot » 10.11.2014 19:32

Всем откликнувшимся спасибо! Рабочим вариантом стал вариант, предложенный nerve'ом, прям как мысли мои прочитал! Как хотел, так и получается. Остальные варианты создавали артефактные файлы с названиями типа "`date"...видимо, с синтаксисом что-то. Кстати, а какие маны лучше почитать по этому делу? Заинтересовала тема создания файлов с названиями, где есть переменные, создание групп файлов и т.п.?

Окончательный вариант (для таких же чайников, как я):
1. Узнаёте, где bash:

Код: Выделить всё

which bash

У меня вывело путь: /usr/bin/bash.

2. Путь в п.1. вставляете в начало своего bash-скрипта:

Код: Выделить всё

#!/usr/bin/bash


3. Окончательный вариант, предложенный nerve:

Код: Выделить всё

 #!/usr/bin/bash
NAME=`date +"%m-%d-%y_%T"`
gnome-screenshot -f /home/$USER/Pictures/screenshots/screenshot_$NAME.png
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как создать файлы с переменными названиями...

Сообщение Bizdelnick » 10.11.2014 19:48

chelovekot писал(а):
10.11.2014 19:32
Остальные варианты создавали артефактные файлы с названиями типа "`date

Я же написал:
Bizdelnick писал(а):
10.11.2014 19:21
Работает только в шелле.

То есть для вызова по хоткею надо либо заворачивать в скрипт, как сделал nerve, либо вызывать sh -c 'gnome-screenshot -f /путь/к/файлу/`date +%Y-%m-%d-%T`.png'.

chelovekot писал(а):
10.11.2014 19:32
Узнаёте, где bash:
Не обязательно именно bash, это работает в любом шелле. Можно использовать

Код: Выделить всё

#!/bin/sh
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

chelovekot
Сообщения: 11
ОС: Fedora 21 (GNOME 3.14)

Re: Как создать файлы с переменными названиями...

Сообщение chelovekot » 10.11.2014 19:57

Bizdelnick писал(а):
10.11.2014 19:48
То есть для вызова по хоткею надо либо заворачивать в скрипт, как сделал nerve, либо вызывать sh -c 'gnome-screenshot -f /путь/к/файлу/`date date +%Y-%m-%d-%T`.png'.

chelovekot писал(а):
10.11.2014 19:32
Узнаёте, где bash:
Не обязательно именно bash, это работает в любом шелле. Можно использовать

Код: Выделить всё

#!/bin/sh



Вариант с

Код: Выделить всё

sh -c 'gnome-screenshot -f /путь/к/файлу/`date date +%Y-%m-%d-%T`.png'
, выдаёт это:
Изображение

Кстати, в плане безопасности, какой путь лучше использовать к шеллу: /usr/bin/bash или /bin/sh? По приоритетам они одинаковы?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как создать файлы с переменными названиями...

Сообщение Bizdelnick » 10.11.2014 19:59

chelovekot писал(а):
10.11.2014 19:32
Кстати, а какие маны лучше почитать по этому делу? Заинтересовала тема создания файлов с названиями, где есть переменные, создание групп файлов и т.п.?

http://www.tldp.org/LDP/Bash-Beginners-Gui...sect_03_04.html
На русском ничего настолько же подробно и доступно написанного сходу не нагуглил.

chelovekot писал(а):
10.11.2014 19:57
Вариант с

Код: Выделить всё

sh -c 'gnome-screenshot -f /путь/к/файлу/`date date +%Y-%m-%d-%T`.png'
, выдаёт это:

Прошу прощения, опечатался. date один раз надо.
Вообще же этот вариант (без ошибок) не лучше и не хуже, а ровно такой же.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

chelovekot
Сообщения: 11
ОС: Fedora 21 (GNOME 3.14)

Re: Как создать файлы с переменными названиями...

Сообщение chelovekot » 10.11.2014 20:04

Bizdelnick писал(а):
10.11.2014 19:59
Spoiler

chelovekot писал(а):
10.11.2014 19:32
Кстати, а какие маны лучше почитать по этому делу? Заинтересовала тема создания файлов с названиями, где есть переменные, создание групп файлов и т.п.?

http://www.tldp.org/LDP/Bash-Beginners-Gui...sect_03_04.html
На русском ничего настолько же подробно и доступно написанного сходу не нагуглил.

chelovekot писал(а):
10.11.2014 19:57
Вариант с

Код: Выделить всё

sh -c 'gnome-screenshot -f /путь/к/файлу/`date date +%Y-%m-%d-%T`.png'
, выдаёт это:

Прошу прощения, опечатался. date один раз надо.
Вообще же этот вариант (без ошибок) не лучше и не хуже, а ровно такой же.


Да, вы правы, работает! Это даже ещё короче вариант! Я про этот

Код: Выделить всё

sh -c 'gnome-screenshot -f /путь/к/файлу/`date +%Y-%m-%d-%T`.png'

Спасибо за ссылку. С английским проблем особо нет, хоть и приятнее по-русски читать)).
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 273
ОС: OpenBSD

Re: Как создать файлы с переменными названиями...

Сообщение nerve » 11.11.2014 12:05


а вы можете своими словами объяснить разницу между подстановкой команды в обратных кавычках и с помощью $()??
$(command)
or like this using backticks:
`command`
Bash performs the expansion by executing COMMAND and replacing the command substitution with the standard output of the command, with any trailing newlines deleted. Embedded newlines are not deleted, but they may be removed during word splitting.
When the old-style backquoted form of substitution is used, backslash retains its literal meaning except when followed by "$", "`", or "\". The first backticks not preceded by a backslash terminates the command substitution. When using the "$(COMMAND)" form, all characters between the parentheses make up the command; none are treated specially.
Command substitutions may be nested. To nest when using the backquoted form, escape the inner backticks with backslashes.
If the substitution appears within double quotes, word splitting and file name expansion are not performed on the results.

выделенное жирным понятно: баш выполняет команду внутри подстановки и выводит результат команды без перевода на новую строку.
а вот дальше не сильно понятно.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как создать файлы с переменными названиями...

Сообщение Bizdelnick » 11.11.2014 13:33

nerve писал(а):
11.11.2014 12:05
а вы можете своими словами объяснить разницу между подстановкой команды в обратных кавычках и с помощью $()??

Главная разница в том, что $() работает только в bash, а `` - в любом POSIX-совместимом шелле. Поэтому предпочитаю использовать ``.
В приведённой цитате разница описана корректно, но не совсем понятно: при использовании `` с помощью \ можно экранировать любой символ кроме "$", "`" или "\", а при использовании $() - вообще любой символ. Если быть более точным, при использовании `` для экранирования этих символов надо использовать \\ вместо \, поскольку строка разбирается дважды: сначала основным шеллом (\\, то есть экранированный \, будет заменяться на неэкранированный \), а потом сабшеллом, которому передаётся после этого (оставшийся \ будет экранировать идущий за ним символ). Строка внутри $() передаётся сабшеллу в неизменном виде.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

liaonau
Сообщения: 390
ОС: gentoo

Re: Как создать файлы с переменными названиями...

Сообщение liaonau » 11.11.2014 14:55

Bizdelnick писал(а):
11.11.2014 13:33
Главная разница в том, что $() работает только в bash, а `` - в любом POSIX-совместимом шелле.

И в zsh, конечно, $() тоже работает, тем самым охватывая де-факто подавляющее большинство используемых оболочек.

$() лучше чем `` из-за возможной вложенности конструкции. …$(… $(… $(…)) …) для `` надо слишком много обратных слешей, будет выглядеть как покосившийся забор.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как создать файлы с переменными названиями...

Сообщение Bizdelnick » 11.11.2014 15:37

liaonau писал(а):
11.11.2014 14:55
И в zsh, конечно, $() тоже работает, тем самым охватывая де-факто подавляющее большинство используемых оболочек.

bash и zsh - это не "большинство используемых оболочек", это, может быть, большинство используемых интерактивных оболочек в GNU/Linux. С извращенцами, пишущими скрипты для zsh, мне общаться не доводилось. А если важна переносимость, то и bash-скипты использовать нельзя.

liaonau писал(а):
11.11.2014 14:55
$() лучше чем `` из-за возможной вложенности конструкции. …$(… $(… $(…)) …) для `` надо слишком много обратных слешей, будет выглядеть как покосившийся забор.

ИМХО если появляется такая конструкция, то есть повод серьёзно задуматься о её нужности независимо от синтаксиса.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как создать файлы с переменными названиями...

Сообщение drBatty » 12.11.2014 09:48

Bizdelnick писал(а):
11.11.2014 15:37
А если важна переносимость, то и bash-скипты использовать нельзя.

а можно-ли вообще использовать скрипты для переносимости? ИМХО — нет. Может на целевой системе вообще shell'а нет, а стоит какая-нить busybox, годная только для запуска утилит? Если уж речь идёт о переносимости, то ИМХО лучше ansi C, образца 1998 года.

А проблема с переносимостью скрипта на bash сводится обычно к установке bash туда, где его нет.
Bizdelnick писал(а):
11.11.2014 13:33
Главная разница в том, что $() работает только в bash, а `` - в любом POSIX-совместимом шелле. Поэтому предпочитаю использовать ``.

А моё ИМХО в том, что проще поставить bash и писать простой и легко-читаемый код. А не заморачиваться с недостижимой "переносимостью".
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как создать файлы с переменными названиями...

Сообщение Bizdelnick » 12.11.2014 10:42

drBatty писал(а):
12.11.2014 09:48
а можно-ли вообще использовать скрипты для переносимости? ИМХО — нет. Может на целевой системе вообще shell'а нет, а стоит какая-нить busybox, годная только для запуска утилит? Если уж речь идёт о переносимости, то ИМХО лучше ansi C, образца 1998 года.

100% переносимости быть не может в любом случае. Но если система POSIX-совместимая, то /bin/sh (хотя бы ash) в ней должен быть.

drBatty писал(а):
12.11.2014 09:48
проблема с переносимостью скрипта на bash сводится обычно к установке bash туда, где его нет.

При условии, что Вы - админ. А если Вы скрипт вообще не для себя пишете?
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

chelovekot
Сообщения: 11
ОС: Fedora 21 (GNOME 3.14)

Re: Как создать файлы с переменными названиями...

Сообщение chelovekot » 12.11.2014 14:33

О, чёрт!! И тут drBatty!! :wacko: :huh: :ohmy:
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 273
ОС: OpenBSD

Re: Как создать файлы с переменными названиями...

Сообщение nerve » 12.11.2014 16:19

Спасибо за объяснение!
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4921
ОС: Gentoo

Re: Как создать файлы с переменными названиями...

Сообщение /dev/random » 12.11.2014 18:00

На самом деле $(...) тоже входит в POSIX. `...` имеет смысл использовать только в том случае, если предполагается работа в древних, до-POSIX-ных шеллах.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как создать файлы с переменными названиями...

Сообщение Bizdelnick » 12.11.2014 18:19

/dev/random писал(а):
12.11.2014 18:00
На самом деле $(...) тоже входит в POSIX.

Да, действительно, это я ошибся. Проверил - в dash и даже ksh работает. Не работает только в вариациях на тему csh.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как создать файлы с переменными названиями...

Сообщение drBatty » 13.11.2014 16:15

Bizdelnick писал(а):
12.11.2014 10:42
100% переносимости быть не может в любом случае. Но если система POSIX-совместимая, то /bin/sh (хотя бы ash) в ней должен быть.

да, вот только в ash код тяжёлый и нечитаемый получается. Сопровождать проще.
Bizdelnick писал(а):
12.11.2014 10:42
При условии, что Вы - админ. А если Вы скрипт вообще не для себя пишете?

"написал и забыл"? Да, вы правы. Лучше тогда POSIX, что-бы не доставали(хотя всё равно достанут).
chelovekot писал(а):
12.11.2014 14:33
О, чёрт!! И тут drBatty!!

я здесь всегда и был, ещё когда другого форума не было. На другом форуме просто веселее, а здесь и без меня полно грамотных людей.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: