Makefile: использование команды cp при чтении из файла - PullRequest
0 голосов
/ 06 января 2019

В makefile я делаю что-то вроде этого -

@while read -r file; do \
    if [ ! -z "$$file" ]; then \
        cp -R path/to/someplace/$$file path/to/someplace/else/$$file \
        fi \
done <filename.txt

filename.txt содержит файлы и папки, такие как -

abc/*.txt
folder1/
folder2/
textfile.txt

Я могу копировать файлы и папки, но в случае abc/*.txt отображается ошибка:

cp: target `/path/to/someplace/else/*.txt' is not a directory.

Можно ли каким-либо образом скопировать эти файлы с подстановочными знаками?

1 Ответ

0 голосов
/ 10 января 2019

На самом деле проблема не в расширении шаблона. Этот бит будет работать, как ожидалось. Ошибка на самом деле из-за результирующей команды cp. Вы в конечном итоге, например:

cp abc/a.txt abc/b.txt other/path/abc/*.txt

Однако для нескольких исходных файлов cp ожидайте, что местом назначения будет каталог, которого нет other/place/abc/* (может быть, если вы его создали, но вряд ли это то, что вы хотели).

Это сказал. Например, вы можете создать целевой каталог, вызвав mkdir -p other/path/`dirname $$file` (экранированный $ для make) и с помощью cp используйте `dirname $$file` также для пункта назначения.

Есть несколько предостережений. Например, если нужно встретить абсолютные пути или символы глобинга, которые также используются в каталогах, ведущих к самим файлам (dir?/*.txt, some/*/file). Возможно, было бы безопаснее использовать, например, tar или cpio:

tar cf - -C /source/path src/*.txt  | tar xf - -C /target/path/
...