Опція -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
команді годуватися аргументів він отримує з труби? (чи завжди це їх останні?)