Как обмениваться словами в имени файла с помощью оболочки?

Конвенция состоит в том, что все, что запускается с a - опция. Это сталкивается с именами файлов, которые запускаются с -. Для работы вокруг этого, большинство команд распознает -- как сигнальная метка конца опций. Все после -- не будет распознан как опции, вместо этого будет взят буквально в качестве имен файлов.

Например,

cat -- --1

или

rm -rf -- --1

Другой метод должен квалифицировать имя файла с путем.

например,

cat ./--1

или даже

cat /home/username/foo/--1

Лучше всего никогда не должен создавать имена файлов, которые запускаются с -. Имена файлов могут содержать все виды символов, включая новую строку, но только потому, что это - possbile, не означает, что необходимо сделать это.

Отвечать на Ваш вопрос: Почему кошка, grep и другие команды не могут понять файлы, запускающиеся со знака "минус"? Поскольку командная строка является просто строкой. Оболочка делает некоторое расширение имени файла и некоторое разделение слова и некоторую переменную замену, но в конце программа получает массив строк.

Как Вы разделяете строки, которые означают опции от строк, которые означают имена файлов? Некоторыми символами сигнальной метки. Конвенция в мире unix/linux состоит в том, чтобы использовать - как символ сигнальной метки. Все, что запускается с a - опция. Ну, почти все. Аргументы опциям могли бы также запуститься с -, но это - деталь отдельной программы.

Не каждая программа соответствует этой конвенции. Возможно самый популярный пример dd:

dd if=/dev/random of=whatfreespace

dd распознает имена файлов, потому что они появляются после = знак.

Большинство, если не все, программы GNU приспосабливают GNU getopt конвенции: короткие опции запускаются с - и только один символ, долгие опции запускаются с -- и по крайней мере два символа. -- на его собственных метках конец опций и всех строк после той метки не распознаны как опции. Для получения дополнительной информации прочитайте Соглашения о синтаксисе Аргумента программы в GNU libc руководство.

Один пример программы, которая только частично соответствует конвенции GNU, find:

find -not -name porn -delete

В то время как find использование - для отличия опций от не опции это не отличается долгие опции от коротких опций. Это действительно распознает -- как конец опций. Каждая программа может определить свой собственный путь, как распознать опции и имена файлов и безотносительно.

Конвенция интерпретировать сингл - поскольку stdin также просто, что, конвенция того, как интерпретировать сингл - символ, когда с этим встречаются в массиве строк.

4
05.10.2014, 11:41
2 ответа

Перенос этого метода, описанного в различных публикациях в блоге и на Ask Ubuntu, в область проектирования и материально-технического обеспечения. Это дословно из ответа АС.


Достичь этого можно с помощью скрипта питона. Сценарий требует установки python-wnck и python-gtk для работы, хотя я думаю, что они установлены по умолчанию в любом случае.

Скопируйте и вставьте его в текстовый редактор и сохраните в разумном месте (например, minimise.py в домашней папке):

#!/usr/bin/env python
import wnck
import gtk

screen = wnck.screen_get_default()

while gtk.events_pending():
    gtk.main_iteration()

windows = screen.get_windows()
active = screen.get_active_window()

for w in windows:
    if not w == active:
        w.minimize()

Затем можно настроить сочетание клавиш, открыв окно «Сочетания клавиш».

Keyboard Shortcuts in Dash

Нажмите кнопку Добавить для создания нового ярлыка.

Keyboard Shortcuts window

Используйте команду bash -c 'python ~/minimise.py' (предполагается, что она была сохранена как minimise.py в домашней папке).

create shortcut

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

Сценарий минимизирует все неактивные окна. Я не думаю, что это очень полезно для вашего примера использования, потому что вы хотите, чтобы все окна Gimp были открыты. Можно использовать несколько другой сценарий, чтобы свернуть все окна, которые не из текущего приложения:

#!/usr/bin/env python
import wnck
import gtk

screen = wnck.screen_get_default()

while gtk.events_pending():
    gtk.main_iteration()

windows = screen.get_windows()
active_app = screen.get_active_window().get_application()

for w in windows:
    if not w.get_application() == active_app:
        w.minimize()
-121--217723-

Вы можете изменить это с помощью setterm -blank X (X - число минут ). Из man setterm :

-blank [0-60|force|poke] (virtual consoles only)
       Sets the interval of inactivity, in minutes,  after  which  the
       screen  will be automatically blanked (using APM if available).
       Without an argument, gets the blank status  (returns  which  vt
       was blanked or zero for unblanked vt).

       The force option keeps screen blank even if a key is pressed.

       The poke option unblank the screen.

Можно также установить параметр ядра consoleblank = Y (Y быть секунд здесь). consoleblank = 0 отключает заглушку.

-121--86139-

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

  1. должны начинаться с буквы
  2. могут содержать дефисы (но никакая другая пунктуация или пробел)

ваше имя образец становится чем-то вроде [[: alpha:]] [[: alpha:] -] * . Затем можно сделать дополнительное разделенное пробелом второе имя как ((?: [[: alpha:]] [[: alpha:] -] *)?) , где структура группы без захвата просто помогает сохранить номера группы захвата прямыми, когда второе имя пустое. Сведение его воедино, например, с помощью команды переименования на основе perl

rename -nv -- 's/(^[^,]*), ([[:alpha:]][[:alpha:]-]*)((?: [[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *

или (что позволяет использовать более общий пробел между полями вместо отдельных мест)

rename -nv -- 's/(^[^,]*),\s+([[:alpha:]][[:alpha:]-]*)((?:\s+[[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *

Переключатель -n не работает, т.е. он фактически не будет выполнять переименования до удаления. Если переименование на основе perl отсутствует, можно использовать комбинацию perl и mv .

0
27.01.2020, 21:01

Поскольку в части описания имени файла может содержаться образец - (дефис между двумя пробелами), можно изменить это на некоторый символ, который не встречается в части описания. Я выбрал £, но это чисто произвольно.

rename 's/ - /£/' *
rename 's/([^,]*), ([^£]*)£/$2 $1 - /' *

s/ - /£/' говорит переименование, чтобы заменить первый экземпляр - , который он находит с £. Вторая команда немного сложнее. Родительские базы (()) используются для группировки выделений вместе -- так что все, что совпадает с паттерном в первом наборе парен, может быть вызвано позже как$1(вплоть до$9). [^,] означает "любой символ, кроме,"; означает "ноль или больше предыдущего символа";[^,]` означает "ноль или больше любого символа, кроме запятой". Так как по умолчанию переименование является жадным, оно соответствует самой длинной строке.

Остальное, я думаю, следует довольно естественно.

Если вы не уверены, появляется ли символ где-нибудь в имени файла, просто запустите:

printf '%s\n' *£*

Если у вас есть perl-переименование:

rename 's/([^,]*), (.*) - /$2 $1 - /' *

Это разобьется, если часть описания имён файлов содержит - (то есть - между двумя пробелами).

Вы должны проверить это флагом -n, который не будет переименовывать файлы, но покажет, что бы это - сделало:

rename -n 's/([^,]*), (.*) - /$2 $1 - /' *
1
27.01.2020, 21:01

Теги

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