LINUX.ORG.RU

Видимо шелл выполняет stat "{}" в первую очередь, после чего получаем ошибку о несуществующем файле/каталоге, и команду find * -print0 | xargs -0 -I '{}' echo.

dsdqmhsx
()

Сначала строку обрабатывает bash, который выполнит ″Command Substitution″ и попытается подставить результат выполнения ″stat {}″.

Не знаю, что вы хотите получить этой командой, странно она выглядит. В чём смысл ″echo″ в вашей строке?

mky ★★★★★
()

xargs -0 -I '{}' echo "$(stat "{}")" - крайне неоднозначная конструкция.

execve("/usr/bin/xargs", ["xargs", "-0", "-I", "{}", "echo", ""])

execve("/usr/bin/stat", ["stat", "{}"])

Непонятно что хотелось сделать в результате.

Чем не вариант find . -exec stat "{}" \; ?

vel ★★★★★
()
Ответ на: комментарий от vel

Есть список файлов для которых надо получить таблицу: 1 колонка – дата модификации файла, 2 колонка – размер файла, 3 колонка – путь к файлу. В пути надо экранировать символ переноса строки, как это делаю команды семейства sha*sum (что еще там экранируется?). Источник списка может быть find, а может быть

cat file_list.txt

Еще stat не экранирует символы переноса строки в пути, т.е.

stat --format="%y  %s  %n" "{}"

не то.

Вот и появилась идея типа такого:

какой_то_источник_списка | xargs -0 -I '{}' printf "%s  %s  %s\n" "$(stat "{}" --format="%y")" "$(stat "{}" --format="%s")" "$(что_то_для_экранирования "{}")"

Ошибка аналогичная: Нет такого файла или каталога

zb2
() автор топика
Ответ на: комментарий от zb2

Ошибка аналогичная: Нет такого файла или каталога

Интерпретатор вызывает на выполнение команды с аргументами. Чтобы аргументы соотвествовали вашими пожеланиями язык интерпретатора содержит специальные управляющие конструкции. Поэтому перед тем как запустить правую команду конвеера | xargs, bash распознает слова-аргументы, видит там свою специальную конструкцию, которую он умеет специально интрепретировать — «$(stat args)», которая означает вначале вызвать stat с аргументами, то что получилось записать в виде одной строки и передать на выполнение как один из аргументов xargs.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Аааа, понятно. Меня еще удивляло почему так работает

find * -print0 | xargs -0 -I '{}' echo "$(echo "{}")"

Т.е. после первичной обработки $() получается:

find * -print0 | xargs -0 -I '{}' echo "{}"

дальше уже понятно.

Как можно изменить команду, чтобы она работала? Можно ли это вообще сделать без циклов?

zb2
() автор топика
Ответ на: комментарий от zb2

Как можно изменить команду, чтобы она работала?

Ну можно как-то так:

while IFS= read -r -d '' file; do
  read field1 field2 ... < <(stat --printf=format "$file")
  printf бла-бла_чего там хотите
done < <(find . -print0)

Можно ли это вообще сделать без циклов?

Зачем?

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от zb2

Чтобы можно было копировать в консоль одной строчкой…

Ну чисто теоретически можно писать xargs sh -c «скрипт», но то что нельзя безошибочно быстро набрать руками надо оформлять как отдельный скрипт и запускать его удобно и быстро «скрипт ключи аргументы».

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)