Насколько я понимаю, следующее должно означать то же самое:
ls -1 | xargs file {}
ls -1 | xargs -I{} file {}
если опция -I не указана, по умолчанию используется -I {}.
Я хочу перечислить все файлы в текущем каталоге и выполнить file
команду для каждого из них. У некоторых есть пробелы в их именах. Однако я заметил разницу. См. ниже:
$ ls -1
Hello World
$ ls -1 | xargs file {}
{}: ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory
Если явно указано -I {}, пропуски в именах файлов обрабатываются как и ожидалось.
xargs file
или xargs -I{} file {}
. Не должно быть xargs file {}
. Я предполагаю, что при явном указании -I {} bash будет воспринимать это как file "Hello World"
. Без -I {} это рассматривается как file Hello World
.
-1
опцию ls
, но она включена по умолчанию, когда выводом ls
является файл или канал, поэтому вам здесь это не нужно. (3) Вы путаете -I
с устаревшей опцией -i
(в нижнем регистре I
). -ifoo
эквивалентно -Ifoo
, но обычный -i
эквивалентно -I{}
. Но используйте -I{}
. (4) Если вы действительно хотите делать то, что говорите, то почему бы просто не сказать file *
?
file
их. Но я придумал более простой пример использования ls
. Вы правы. За это file *
самое лучшее.
-exec
.