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

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

Другие вопросы по тегам