mkdir test_dir test_dir1 test_dir2 test_dir3
touch file1 file2 file3
cp -v file* test_dir*/
Это копируется только в test_dir3, но не в test_dir, test_dir1, test_dir2. Зачем?
В этом отношении он копирует только в последний каталог, например test_dir4, а не в какой-либо другой каталог (он их опускает).
У вас есть эти три команды
mkdir test_dir test_dir1 test_dir2 test_dir3
touch file1 file2 file3
cp -v file* test_dir*/
Предполагая, что нет других файлов или каталогов в .
перед запуском примера подстановочные знаки в последней строке расширяются следующим образом:
cp -v file1 file2 file3 test_dir/ test_dir1/ test_dir2/ test_dir3/
(Вы можете увидеть это, изменив cp
к echo cp
и наблюдая за результатом.) Вы не сказали нам диагностические сообщения, созданные cp -v
, которые показывают, что он пытается сделать, то есть скопировать каждый элемент командной строки, кроме последнего, в последний элемент, который, следовательно, должен быть каталогом:
‘file1’ -> ‘test_dir3/file1’
‘file2’ -> ‘test_dir3/file2’
‘file3’ -> ‘test_dir3/file3’
cp: omitting directory ‘test_dir/’
cp: omitting directory ‘test_dir1/’
cp: omitting directory ‘test_dir2/’
Поскольку cp
Команды работает так. Если у него больше 2 аргументов, последний аргумент должен быть каталогом, и каждый аргумент перед этим будет скопирован в.
Я думаю ты хочешь cp
который ведет себя больше как окна copy
command, и да, такие инструменты есть, хотя они и не используются широко. Даже мне пришлось гуглить для этого.
Ваша фактическая цель может быть легко достигнута с помощью простого цикла:
for i in test_dir*; do cp -v test_file* $i; done
Это намного проще, как кажется на первый взгляд. Bash на самом деле является базовым языком программирования, и выполнение циклов или даже более сложных операций в однострочных командах в среде unix довольно распространено.