Опція -iбере необов’язковий аргумент. Оскільки ви поставили пробіл після -i, не було жодного аргументу до -iваріанту, і тому подальший -0не був варіантом, xargsа другим із 6 операндів {} -0 mv -t /some/path {}.
З єдиною опцією -i, xargs очікував, що розділений новим рядком список назв файлів. Оскільки, мабуть, не було нового рядка у введенні, xargs отримав те, що було схоже на величезне ім'я файлу (із вбудованими нульовими байтами, але xargs цього не перевірив). Цей єдиний рядок, що містить весь вихід, findбув довший максимальної довжини командного рядка, отже, помилка «командний рядок занадто довга».
Ваша команда працювала б -i{}замість цього -i {}. Крім того, ви могли б використовувати -I {}: -Iє подібним до -i, але приймає обов'язковий аргумент, тому наступний аргумент, переданий до xargs, використовується як аргумент -Iопції. Тоді аргумент після цього, -0який інтерпретується як варіант тощо.
Однак вам взагалі не слід користуватися -I {}. Використання -Iмає три ефекти:
-Iвимикає обробку цитат, що -0вже є.
-Iзмінює рядок для заміни, але {}це значення за замовчуванням.
-Iпризводить до того, що команда виконується окремо для кожного запису вводу, що тут марно, оскільки ваша команда ( mv -t) спеціально призначена для впорядкування декількох файлів за виклик.
Або краплі, -Iі -iвзагалі
find /foo/bar -name '*.mp4' -print0 | xargs -0 mv -t /some/path {}
або скиньте xargs та використовуйте -exec:
find /foo/bar -name '*.mp4' -exec mv -t /some/path {} +
"This approach shouldn't be used"який підхід слід використовувати замість цього? Було"find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir'"б краще рішення? Якщо так, то як жеxargsзнати в цьому випадку , коли вmvкоманді годуватися аргументів він отримує з труби? (чи завжди це їх останні?)