Как войти только в последнее имя каталога?
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, а не в любой другой каталог (он их опускает).
2 ответа
У вас есть эти три команды
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
команда, и да, есть такие инструменты, хотя они не используются широко. Даже я должен был Google для этого.
Ваша фактическая цель может быть легко достигнута простым циклом:
for i in test_dir*; do cp -v test_file* $i; done
Это гораздо проще, чем кажется на первый взгляд. Bash на самом деле является базовым языком программирования, и выполнение циклов или даже более сложных операций в однострочных командах в среде Unix довольно распространено.