Почему моя команда find и xargs copy работает для одной папки, а не для другой? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть две директории, x86_64 и i386.Я хочу отфильтровать тестовые RPMS из обеих этих папок и поместить их в отдельную;test_release/{version}-x86_64/x86_64 и test_release/{version}-i386/i386, соответственно.

Итак, моя первая команда работает нормально:

find x86_64/ -type f -name '*test*' -o -name '*demo*' -o -name '*log*' |
xargs cp -rt test_release/${RELEASE}-x86_64/x86_64

Моя вторая команда точно такая же, за исключением разных имен папок:

find i386/ -type f -name '*test*' -o -name '*demo*' -o -name '*log*' |
xargs cp -rt test_release/${RELEASE}-i386/i386

Только вторая команда выдает мне ошибку:

cp: missing file operand

Я что-то упустил?

1 Ответ

0 голосов
/ 28 сентября 2019

Ошибка возникает из-за того, что ваша команда find не возвращает никаких файлов.К сожалению, xargs все еще запускает cp, но в итоге вызывает его с слишком малым количеством аргументов;и поэтому вы получите сообщение об ошибке.

GNU xargs имеет опцию -r, которая решает этот конкретный случай;но более переносимым и более надежным решением является использование find -exec.

find i386/ -type f -name '*test*' -o -name '*demo*' -o -name '*log*' \
    -exec cp -rt "test_release/${RELEASE}-i386/i386" {} +

Терминатор оператора + для -exec не является полностью переносимым, но если у вас есть cp -t Я полагаю, вы 'на Linux, или, по крайней мере, используете недавний find (GNU или не GNU. Если нет, замена + на \; - это обходной путь, хотя в конечном итоге он будет запускать больше процессов, чем эквивалентная конструкция xargs).

...