Аргумент -I
работает следующим образом: -I something
означает, что буквально встречается something
заменяются аргументом команды.Демо:
$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c
Видите? xargs
взял каждую из строк a
, b
и c
и подставил их вместо f
в эхо эй ф эй ф
.
Нет {}
.
Параметр -I
- POSIX. GNU xargs
документирует устаревшую опцию -i
, которая при вызове как -iwhatever
ведет себя как -I something
. При вызове просто -i
он ведет себя как -I {}
. В этом случае заменяются вхождения {}
. {}
явно вдохновлен особенностью find
: его предикатом -exec
.
Синтаксис Bash {a..b}
и foo {a, b, c} bar
обрабатывается с помощью его «фигурных скобок». {}
не имеет особого значения и передается команде как есть. (В противном случае это нарушило бы стандартные, часто встречающиеся вызовы find
.)
Расширение истории может быть полезно для такого рода вещей (при условии, что история bash включена).
В вашем примере вы можете сделать:
cp /etc/prog/dir1/myconfig.yml !#:1.bak
Здесь ! #
относится к текущей строке, ! #: 1
относится к параметру 1 в текущей строке,
и ! #: 1.bak
относится к параметру 1 в текущей строке с прикрепленным к концу '.bak'.
Когда вы напечатали спецификатор истории, вы можете использовать Ctrl + Alt + E , чтобы развернуть его до фактического значения, если вы хотите, например, дважды проверьте или измените имя файла.
Раздел «Расширение истории» на страницах руководства bash содержит дополнительную информацию.
Вы также можете фактически вырезать-вставить (kill-yank в терминах emacs / bash) из командной строки, чтобы дублировать части для редактирования.
M-d
убивает вперед до границы слова, и вы можете уничтожить текст несколько раз, и все они будут объединены в одну «пасту» для восстановления. Удобный!
Верните все это обратно в командную строку под курсором с помощью C-y
. Итак, если у вас есть такая строка (элемент блока █ указывает положение курсора):
$ cp avb.txt█ (M-b M-b)
$ cp█avb.txt (M-d) kill the word 'avb'
$ cp █.txt (C-y) yank it back
$ cp avb█.txt (C-e) to the end of line
$ cp avb.txt█ (C-y) yank it again
$ cp avb.txt avb█ finish the line
$ cp avb.txt avb.foo█
В любом случае, вы предпочитаете это делать, ознакомление с тем, что bash может предложить в отделе интерактивных клавиш, будет полезным. http://web.mit.edu/gnu/doc/html/features_7.html
Есть несколько уловок (думаю, можно найти дубликат), но для этого я обычно использую
cp /etc/prog/dir1/myconfig.yml{,.bak}
, что дает расширен до вашей команды.
Это известно как раскладывание скобок . В используемой здесь форме выражение {}
определяет количество строк, разделенных запятыми. Они «расширяют» все выражение /etc/prog/dir1/myconfig.yml {, .bak}
, заменяя часть {}
каждой строкой по очереди: пустая строка, давая /etc/prog/dir1/myconfig.yml
, а затем .bak
, давая /etc/prog/dir1/myconfig.yml.bak
. Результатом будет
cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak
Эти выражения могут быть вложенными:
echo a{b,c,d{e,f,g}}
производит
ab ac ade adf adg
Существует вариант, использующий числа для создания последовательностей:
echo {1..10}
производит
1 2 3 4 5 6 7 8 9 10
, и вы также можете указать шаг:
echo {0..10..5}
производит
0 5 10
Похоже на ответ progo, но несколько проще: C-w
вырезает ("убивает") слово слева от курсора, C-y
вставляет ("выдергивает") его снова.
$ cp /etc/dir1/myconfig.yml█ (C-w)
$ cp █ (C-y)
$ cp /etc/dir1/myconfig.yml█ (space, C-y)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml█ (finish text)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml.bak█
В tcsh
или zsh
, Alt + Ctrl + _ в Режим emacs
(виджет copy-prev-word
) вставляет последнее слово, поэтому
cp very-long-path Alt+Ctrl+_.back
bash
имеет виджет copy-backward-word
(не привязанный к любая клавиша по умолчанию), но это только копирует слово в кольцевой буфер, вам также нужно будет нажать Ctrl-Y (в режиме emacs
), чтобы восстановить его. Но вы могли бы сделать:
bind '"\e[cpw~": copy-backward-word'
bind '"\e\C-_": "\e[cpw~\C-Y"'
Чтобы Alt + Ctrl + _ выполняли как копирование / snarf, так и paste / yank, как в tcsh
/ zsh
.