1

我的脚本根据它提取的信息生成多个包含随机名称的文件。我创建了这个测试来尝试将运行时创建的所有新文件移动到以正在运行的文件命名的新目录中。

当我使用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': 没有这样的文件或目录

我相信这是由于它在 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"])

4

1 回答 1

1

您的怀疑是正确的:问题是您有两个文件名用空格连接在一起。由于您正在使用Popen()而不是os.popen()绕过参数的 shell 解释,这意味着各个文件名不会分开。这与您在命令行上使用引号相同:

mv 'file1 file2' destination
mv: cannot stat 'file1 file2': No such file or directory

您已要求它移动名称中间有空格的单个文件。您需要做的是使每个文件名成为列表中的单独元素Popen()

cmd = Popen(["mv", file1, file2, destination])

在上面的代码的情况下dirDifference(),它可以简单地返回一个列表,而不是返回用空格连接在一起的文件名,您可以使用它Popen()

cmd = Popen(["mv"] + moveFiles + [filename + "_dir"])

(确保这moveFiles是一个非空列表当然)

于 2021-07-24T14:05:58.867 回答