0
enter code here
import os
os.chdir('I:\\Movies')
files = os.popen('dir').readlines()
disk = raw_input("Enter the disk: ")
while disk != "done":
    os.chdir(disk + ':\\' + 'Movies')
    files_in_disk = os.popen('dir').readlines()
    for each_file in files_in_disk:
        for item in files:
            if ' '.join(each_file.split()[3:]) in item:
                each_file = ' '.join(each_file.split()[3:])
                os.system('rmdir /q /s ' + '"' + each_file + '"')
                break


    disk = raw_input("Enter the disk: ") 

我在两个不同的驱动器上有两个相同电影的副本,我编写了这个脚本来
删除其中一个副本。但是在E盘上它几乎擦除了我所有的文件,为什么会发生这种情况,请有人指出我的错误。

4

3 回答 3

1

我认为这里的某些事情并没有达到您的预期:

if ' '.join(each_file.split()[3:]) in item:

如果任何文件的空格分隔部分少于 4 个,则 if 的第一位将为空字符串,这将返回 true。

问题是你的循环。对于 E:\Movies 中的每个文件,它会检查 I:\Movies 中的任何文件是否匹配(嗯,第三个单词之后的所有内容)。如果 I:\Movies 中的某个文件恰好有少于 4 个单词(并非完全不可信),那么每次运行时 if 都为真。

我不确定这里的意图是什么,但这是我对可能导致问题的最佳猜测。

于 2013-03-20T06:24:09.513 回答
0

According to Microsft's TechNet article about rmdir:

/s : Removes the specified directory and all subdirectories including any files. Use /s to remove a tree.

So, if according to the other answers it is possible to supply non-matching file paths to rmdir it is not very difficult to delete whole subtrees on the disk. Especially if the list of files also contains subdirectories that point to parent subdirectories (for instance i:\movies..), you could be in a world of hurt in cases like that.

But I don't have access to a Windows machine with Python installed to prove it.

于 2013-06-07T10:00:07.913 回答
0

您的错误不是最初使用print each_file语句运行该程序,而是立即跳转到rmdir命令。

虽然这可能读作一个刻薄的答案,但它确实是有帮助的。每当进行不可逆转的更改(例如从文件系统或数据库中删除项目)时,应始终采取一些步骤来验证是否正在生成/执行适当的指令。

于 2013-03-20T06:17:04.747 回答