2015-04-08 3 views
0

Я читаю xargs: How To Control and Use Command Line Arguments, и найти следующий пример:Какова функция "{}" в оболочке bash?

{} as the argument list marker 
...... 
$ find . -name "*.bak" -print0 | xargs -0 -I {} mv {} ~/old.files 

Я не могу понять точный смысл и функции {} в bash shell, может кто-нибудь дать подробную explantion?

+0

Вы попробуйте прочитать инструкцию для xargs, где он говорит вам, как именно это работает? –

ответ

0

При использовании в качестве имени программы или аргумент, {} не имеет особого значения или использования в bash или других оболочках, основанных на синтаксисе Bourne. Он просто остается неизменным и передается утилите. Технически ничто даже не запрещает называть программу {}.

С другой стороны, find утилита -exec раздел использует {} представлять совпадающий файл (ы), например:

find /tmp -name "*.txt" -exec ls -l {} + 

Для согласованности с находкой, {} также используется по умолчанию или явно с xargs для представления строки, подлежащей замене.

ls /tmp/*.txt | xargs -I {} ls -l {} 

Обратите внимание, что xargs бесполезен в данном примере вы процитировать, как находка уже может делать то, что, как ожидается, себя:

find . -name "*.bak" -exec mv {} ~/old.files \; 
+0

Таким образом, '{}' имеет особое значение в команде 'find ... exec', в других случаях' bash shell', это не имеет особого значения и просто обычные литералы. Правильно? –

+1

Это действительно так. – jlliagre

2

Это прямо в вашем вопросе:

{} в качестве списка аргументов маркера

Он используется в качестве маркера (заполнитель) для списка аргументов. Например, здесь аргументы будут помещены в командную строку. Так, например, если у вас было два файла, соответствующие *.bak (one.bak и two.bak), команды xargs будет генерировать бы:

mv one.bak ~/old.files 
mv two.bak ~/old.files 

Просто абзац или два дальше:

Вы можете переименовать { } к чему-то другому. В следующем примере {} переименовывается как файл. Это более читаемым как по сравнению с предыдущим примером:

$ find . -name "*.bak" -print0 | xargs -0 -I file mv file ~/old.files 

В статье не потрудился сказать вам, но это с помощью опции -I изменить строку маркера. От info xargs:

'-I ЗАМЕНЫ-STR'

'--replace [= REPLACE-СТР]'

'-i [Replace-СТР]

Заменить вхождения REPLACE-STR в начальных аргументах с именами , считанными со стандартного ввода. Кроме того, некотируемые пробелы не прекращают аргументы; вместо этого вход делится только на новые строки. Если REPLACE-STR опущен (опускание разрешено только для '-i'), по умолчанию используется '{}' (например, для 'find -exec'). Подразумевает '-x' и '-l 1'. Параметр «-i» устарел в пользу опции «-I».

2

{} это ключевое слово для xargs.Your ЦМД означает найти все *.bak file.And дать каждому .bak имя файла xargs в {} (используя -I {} опция) Так вы можете использовать имя файла в качестве аргумента здесь ,

Например. Если находка CMD дает выход

1.bak
2.bak
3.bak

Каждое имя файла здесь дает xargs как {}.Таким образом, mv {} ~/old.files переведет

мв 1.bak ~/old.files
мв 2.bak ~/old.files
мв 3.bak ~/old.files

Предположим что вы хотите переименовать каждый файл .bak в .bak.2015-04-01. Вы должны использовать имя файла дважды в своем mv cmd.

мв 1.bak 1.bak.2015-04-01

Вы можете сделать это произошло с помощью

find . -name "*.bak" -print0 | xargs -0 -I {} mv {} {}.2015-04-01

+0

Это не ключевое слово для xargs, это просто то, что большинство людей установили -I. –

+0

@JID '{}' не только то, что большинство людей задает '-I', но также и то, что' xargs' использует по умолчанию, когда аргумент параметра -i' опущен. – jlliagre

+0

@jlliagre Я знаю, это все еще не ключевое слово. –

Смежные вопросы