去掉 subprocess.Popen 中的撇号以移动文件
Getting rid of the apostrophe in subprocess.Popen to move files
我的脚本根据它提取的信息生成多个包含 运行dom 名称的文件。我创建此测试是为了尝试将 运行 时创建的所有新文件移动到以 运行.
文件命名的新目录中
当我使用 os.popen("mv " + moveFiles +' ' + filename + "_dir")
时它工作得很好,但是 os.popen 由于 shellshock
被认为是不安全的
当切换到 cmd = Popen(["mv", str(moveFiles), filename + "_dir"])
时,出现以下错误
mv: cannot stat '/home/test/testing/TestFile1.txt
/home/test/testing/TestFile2.txt': No such file or directory
我相信这是因为它在 moveFiles 变量的开头和结尾添加了撇号,它试图将其作为 1 个文件而不是 2 个文件移动。所以它在创建单个文件时有效,但会导致错误。有没有办法删除它?
'/home/test/testing/TestFile1.txt /home/test/testing/TestFile2.txt'
def createDir(filename):
"""
createDir creates the folder of the file/argument given (Example.txt_dir)
"""
Dir = str(filename) + "_dir"
cmd = Popen(["mkdir", Dir], stdout=PIPE, stderr=PIPE)
def createFiles(filename):
"""
createFiles creates test files to move into Example.txt_dir
"""
with open('TestFile1.txt', 'w') as m:
cmd = Popen(["file", filename], stdout=m, stderr=PIPE)
print('Saved as TestFile1.txt')
with open('TestFile2.txt', 'w') as m:
cmd = Popen(["file", filename], stdout=m, stderr=PIPE)
print('Saved as TestFile2.txt')
def dirDifference(dir1, dir2):
"""
dirDifference compares 2 paths, 1 before being ran and 1 after to get a list of all new files to be moved
"""
#Compares Directory before and after running
dif = [i for i in dir1 + dir2 if i not in dir1 or i not in dir2]
separator = ' '
x = separator.join(map(str, dif))
return x
def moveDir(filename, moveFiles):
"""
moveDir: Moves the new files to the directory.
"""
Dir = str(filename) + "_dir"
cmd = Popen(["mv", moveFiles, filename + "_dir"])
您的怀疑是正确的:问题在于您将两个文件名与 space 连接在一起。由于您使用的是 Popen()
而不是 os.popen()
,因此您绕过了参数的 shell 解释,这意味着单个文件名不会被分开。这与您在命令行中使用引号相同:
mv 'file1 file2' destination
mv: cannot stat 'file1 file2': No such file or directory
您要求它移动名称中间有一个 space 的单个文件。您需要做的是使每个文件名成为 Popen()
:
列表中的一个单独元素
cmd = Popen(["mv", file1, file2, destination])
对于上面的代码,不是 dirDifference()
returning 文件名与 spaces 连接在一起,它可以简单地 return 一个列表,你可以与 Popen()
:
一起使用
cmd = Popen(["mv"] + moveFiles + [filename + "_dir"])
(确保 moveFiles
当然是一个非空列表)
我的脚本根据它提取的信息生成多个包含 运行dom 名称的文件。我创建此测试是为了尝试将 运行 时创建的所有新文件移动到以 运行.
文件命名的新目录中当我使用 os.popen("mv " + moveFiles +' ' + filename + "_dir")
时它工作得很好,但是 os.popen 由于 shellshock
当切换到 cmd = Popen(["mv", str(moveFiles), filename + "_dir"])
时,出现以下错误
mv: cannot stat '/home/test/testing/TestFile1.txt /home/test/testing/TestFile2.txt': No such file or directory
我相信这是因为它在 moveFiles 变量的开头和结尾添加了撇号,它试图将其作为 1 个文件而不是 2 个文件移动。所以它在创建单个文件时有效,但会导致错误。有没有办法删除它?
'/home/test/testing/TestFile1.txt /home/test/testing/TestFile2.txt'
def createDir(filename):
"""
createDir creates the folder of the file/argument given (Example.txt_dir)
"""
Dir = str(filename) + "_dir"
cmd = Popen(["mkdir", Dir], stdout=PIPE, stderr=PIPE)
def createFiles(filename):
"""
createFiles creates test files to move into Example.txt_dir
"""
with open('TestFile1.txt', 'w') as m:
cmd = Popen(["file", filename], stdout=m, stderr=PIPE)
print('Saved as TestFile1.txt')
with open('TestFile2.txt', 'w') as m:
cmd = Popen(["file", filename], stdout=m, stderr=PIPE)
print('Saved as TestFile2.txt')
def dirDifference(dir1, dir2):
"""
dirDifference compares 2 paths, 1 before being ran and 1 after to get a list of all new files to be moved
"""
#Compares Directory before and after running
dif = [i for i in dir1 + dir2 if i not in dir1 or i not in dir2]
separator = ' '
x = separator.join(map(str, dif))
return x
def moveDir(filename, moveFiles):
"""
moveDir: Moves the new files to the directory.
"""
Dir = str(filename) + "_dir"
cmd = Popen(["mv", moveFiles, filename + "_dir"])
您的怀疑是正确的:问题在于您将两个文件名与 space 连接在一起。由于您使用的是 Popen()
而不是 os.popen()
,因此您绕过了参数的 shell 解释,这意味着单个文件名不会被分开。这与您在命令行中使用引号相同:
mv 'file1 file2' destination
mv: cannot stat 'file1 file2': No such file or directory
您要求它移动名称中间有一个 space 的单个文件。您需要做的是使每个文件名成为 Popen()
:
cmd = Popen(["mv", file1, file2, destination])
对于上面的代码,不是 dirDifference()
returning 文件名与 spaces 连接在一起,它可以简单地 return 一个列表,你可以与 Popen()
:
cmd = Popen(["mv"] + moveFiles + [filename + "_dir"])
(确保 moveFiles
当然是一个非空列表)