Насколько я понимаю, следующее должно означать то же самое:
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.