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盘上它几乎删除了我的所有文件,为什么会发生这种情况,有人可以指出我的错误。
答案 0 :(得分:1)
我认为这里没有做你期望的事情:
if ' '.join(each_file.split()[3:]) in item:
如果任何文件的空格分隔少于4个,则if的第一位将为空字符串,这将返回true。
问题在于你的循环。对于E:\ Movies中的每个文件,它会检查I:\ Movies中的任何文件是否匹配(以及所有超过第三个单词的文件)。如果I:\ Movies中的一个文件恰好少于4个单词(并非完全不可信),则每次运行时if都为真。
我不确定这里有什么意图,但这是我对可能导致问题的最佳猜测。
答案 1 :(得分:0)
您的错误最初并非使用print each_file
语句运行此程序,而不是立即跳转到rmdir
命令。
虽然这可能是一个讽刺的答案,但这确实是有帮助的。每当进行不可逆转的更改(例如从文件系统或数据库中删除项目)时,应始终采取一些步骤来验证是否正在生成/执行相应的指令。
答案 2 :(得分:0)
根据Microsft的TechNet关于rmdir的文章:
/ s:删除指定的目录和所有子目录,包括任何文件。使用/ s删除树。
因此,如果根据其他答案,可以向rmdir提供不匹配的文件路径,则删除磁盘上的整个子树并不是很困难。特别是如果文件列表还包含指向父子目录的子目录(例如i:\ movies ..),那么在这种情况下你可能处于一个受伤的世界。
但我无法访问安装了Python的Windows机器来证明这一点。