Назад | Перейти на главную страницу

Как ввести cp только в последнее имя каталога?

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 довольно распространено.