Makefile:从文件读取时使用 cp 命令

Makefile: using cp command while reading from a file

在 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.

有什么方法可以用通配符复制这些文件吗?

其实问题不在模式扩展。该位似乎按预期工作。该错误实际上是由于生成的 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?/*.txtsome/*/file)。使用例如 tarcpio:

可能更安全
tar cf - -C /source/path src/*.txt  | tar xf - -C /target/path/