我正在尝试将一些文件从一个目录复制到另一个目录。我希望一个目录中的所有文件都以另一个目录的根目录结束。
当我在终端中运行它时,此命令完全符合我的要求:
cp -rv ./src/CopyPasteIntoBuildDir/* ./build-root/src/
然而,这行python复制了大部分文件,就像上面的命令一样,但是它将一些新文件留空。具体来说,子目录中的文件是空的。
subprocess.check_call("cp -rv ./src/CopyPasteIntoBuildDir/* ./build-root/src/", shell=True)
如果文件不在那里,它会创建文件,如果文件不存在则会截断它们。
发生了什么事?
答案 0 :(得分:1)
假设您决定使用cp
而不是本机Python操作 -
如果您将代码写入而不是调用任何shell ,则此代码将更加可靠。为了避免在源上需要/*
(以及它的副作用 - 即拒绝复制名称超过ARG_MAX
组合环境和命令行大小存储限制的目录),请使用{ {1}}作为要复制其内容的目录名称的最后一个元素,而不是传递需要由shell扩展的通配符。
.
subprocess.check_call(["cp", "-R", "--", '%s/.' % src, dest])
而不是cp -R
的使用是cp -rv
,而不是-R
,是POSIX标准化的(因此可以在所有兼容的UNIX类平台上移植)
-r
...发出的输出类似于:
tempdir=$(mktemp -d -t testdir.XXXXXX)
trap 'rm -rf "$tempdir"' EXIT
cd "$tempdir"
mkdir -p ./src/CopyPasteIntoBuildDir/subdir-1 ./build-root/src/
touch ./src/CopyPasteIntoBuildDir/file-1
touch ./src/CopyPasteIntoBuildDir/subdir-1/file-2
script='
import sys, shutil, subprocess
src = sys.argv[1]
dest = sys.argv[2]
subprocess.check_call(["cp", "-R", "--", "%s/." % src, dest])
'
python -c "$script" ./src/CopyPasteIntoBuildDir ./build-root/src/
find ./build-root -type f -print
rm -rf "$tempdir"
...显示内容已正确递归复制,没有前缀。
答案 1 :(得分:-1)
显然这是standard error
的问题。使用bash代替工作。
sh
编辑:看到接受的答案!