子进程cp保留一些文件为空

2024-04-20 13:29:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把一些文件从一个目录复制到另一个目录。我希望一个目录中的所有文件都位于另一个目录的根目录中。你知道吗

当我在终端中运行此命令时,它正是我想要的:

cp -rv ./src/CopyPasteIntoBuildDir/* ./build-root/src/

然而,这行python会像上面的命令一样复制大多数文件,但会留下一些新文件为空。具体来说,子目录中的文件是空的。你知道吗

subprocess.check_call("cp -rv ./src/CopyPasteIntoBuildDir/* ./build-root/src/", shell=True)

如果文件不在那里,它会创建文件,如果在那里,它会截断文件。你知道吗

怎么回事?你知道吗


Tags: 文件命令buildsrc目录终端checkroot
2条回答

假设您决定使用cp而不是本机Python操作

如果将此代码编写为而不调用任何shell,则此代码将更加可靠。为了避免在源代码上使用/*(以及此操作的副作用,即拒绝复制名称超过ARG_MAX组合环境和命令行大小存储限制的目录),请使用.作为要复制内容的目录名称的最后一个元素,而不是传递需要由shell展开的通配符。你知道吗

subprocess.check_call(["cp", "-R", " ", '%s/.' % src, dest])

使用cp -R而不是cp -rv是因为-R,而不是-r,这是POSIX标准化的(因此可以在所有兼容的UNIXlike平台上移植)。你知道吗


实际演示(可复制/可粘贴代码)

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"

…输出类似于:

./build-root/src/file-1
./build-root/src/subdir-1/file-2

…显示内容被正确地递归复制,没有前缀。你知道吗

显然这是sh的问题。改用bash是可行的。你知道吗

subprocess.check_call("cp -rv ./src/CopyPasteIntoBuildDir/* ./build-root/src/", shell=True, executable="/bin/bash")

编辑:见接受答案!

相关问题 更多 >