免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5324 | 回复: 4
打印 上一主题 下一主题

如何处理包含'或者空格的文件名 [复制链接]

论坛徽章:
13
CU大牛徽章
日期:2013-03-14 14:14:082016科比退役纪念章
日期:2016-07-22 11:15:35数据库技术版块每日发帖之星
日期:2016-05-27 06:20:002015亚冠之吉达阿赫利
日期:2015-08-05 10:06:542015年亚洲杯之韩国
日期:2015-04-01 16:05:42双鱼座
日期:2014-11-13 11:04:24丑牛
日期:2014-07-25 17:29:54子鼠
日期:2014-04-25 12:25:45丑牛
日期:2014-04-17 08:35:48巨蟹座
日期:2014-04-16 16:50:05CU大牛徽章
日期:2013-03-14 14:14:29CU大牛徽章
日期:2013-03-14 14:14:26
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-01-03 15:54 |只看该作者 |倒序浏览
我有个脚本是打印所有.txt 文件的md5 digest,但是发现在有空格或者文件名有'的时候,这个脚本会报错。
  1. import os
  2. import subprocess
  3. import stat

  4. def print_all_md5(dirname):
  5.     ll=[]
  6.     for root,dirs,files in os.walk(dirname):
  7.         for name in files:
  8.             ll.append((os.path.join(root,name)))
  9.    
  10.     for i in ll:
  11.         if stat.S_ISFIFO(os.stat(i).st_mode):
  12.             ll.remove(i)


  13.     for filename in ll:
  14.         if filename.endswith('txt'):
  15.             cmd="md5sum "+filename
  16.             fp=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  17.             (s,e)=fp.communicate()
  18.             result=(s.decode()).strip()
  19.             e=(e.decode()).strip()
  20.             print(result,e)

  21. print_all_md5(dirname=".")
复制代码
我应该怎么处理呢?

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
2 [报告]
发表于 2016-01-03 16:01 |只看该作者
改变文件名 []
====>
文件名没有 [空格,  ']

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-01-15 06:20:00操作系统版块每日发帖之星
日期:2016-01-16 06:20:00IT运维版块每日发帖之星
日期:2016-02-04 06:20:00数据库技术版块每日发帖之星
日期:2016-02-04 06:20:00程序设计版块每日发帖之星
日期:2016-02-10 06:20:01每日论坛发贴之星
日期:2016-02-10 06:20:01
3 [报告]
发表于 2016-01-05 13:30 |只看该作者
本帖最后由 zhonghua7896321 于 2016-01-05 13:46 编辑

用glob模块来查找txt结尾的文件,然后循环处理

[root@server01 Test]# python find_file.py
(u'd41d8cd98f00b204e9800998ecf8427e  a\nd41d8cd98f00b204e9800998ecf8427e  .txt', u'')
(u'333acdcdb62bd6d001b275c885f807f5  A.txt', u'')
[root@server01 Test]# ll
total 12
-rw-r--r-- 1 root root   0 Jan  4 21:40 a
-rw-r--r-- 1 root root   0 Jan  4 21:45 a    .txt
-rw-r--r-- 1 root root  68 Jan  4 21:39 A.txt
-rw-r--r-- 1 root root 395 Jan  4 21:44 find_file.py
-rw-r--r-- 1 root root 210 Jan  4 21:39 remove.py
-rw-r--r-- 1 root root   0 Jan  4 21:40 x.html
[root@server01 Test]#
[root@server01 Test]# cat find_file.py
import glob
import stat
import subprocess

def print_md5(dirname):
    files = glob.glob("*.txt")
    for f in files:
        cmd = "md5sum " + f
        fp = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        (s,e) = fp.communicate()
        result = (s.decode()).strip()
        e = (e.decode()).strip()
        print (result, e)

print_md5(dirname=".")
[root@server01 Test]#

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-01-15 06:20:00操作系统版块每日发帖之星
日期:2016-01-16 06:20:00IT运维版块每日发帖之星
日期:2016-02-04 06:20:00数据库技术版块每日发帖之星
日期:2016-02-04 06:20:00程序设计版块每日发帖之星
日期:2016-02-10 06:20:01每日论坛发贴之星
日期:2016-02-10 06:20:01
4 [报告]
发表于 2016-01-05 13:59 |只看该作者
回复 3# zhonghua7896321


    我刚才发现我的解决办法有问题,对文件名含有引号的文件没法获得md5值。

另外一个解决办法:引入hashlib模块来解决

[root@server01 Test]# python find_file.py
a    .txt
(u'd41d8cd98f00b204e9800998ecf8427e  a\nd41d8cd98f00b204e9800998ecf8427e  .txt', u'')
=================
d41d8cd98f00b204e9800998ecf8427e


1233'atdz.txt
(u'', u"/bin/sh: -c: line 0: unexpected EOF while looking for matching `''\n/bin/sh: -c: line 1: syntax error: unexpected end of file")
=================
68b329da9893e34099c7d8ad5cb9c940


A.txt
(u'333acdcdb62bd6d001b275c885f807f5  A.txt', u'')
=================
333acdcdb62bd6d001b275c885f807f5


[root@server01 Test]# ll
total 16
-rw-r--r-- 1 root root   1 Jan  4 21:51 1233'atdz.txt
-rw-r--r-- 1 root root   0 Jan  4 21:40 a
-rw-r--r-- 1 root root   0 Jan  4 21:45 a    .txt
-rw-r--r-- 1 root root  68 Jan  4 21:39 A.txt
-rw-r--r-- 1 root root 588 Jan  4 21:54 find_file.py
-rw-r--r-- 1 root root 210 Jan  4 21:39 remove.py
-rw-r--r-- 1 root root   0 Jan  4 21:40 x.html
[root@server01 Test]#
[root@server01 Test]# cat find_file.py
import glob
import stat
import subprocess
import hashlib


def print_md5(dirname):
    files = glob.glob("*.txt")
    for f in files:
        print f
        cmd = "md5sum " + f
        fp = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        (s,e) = fp.communicate()
        result = (s.decode()).strip()
        e = (e.decode()).strip()
        print (result, e)

        print "================="
        md5file=open(f)
        md5=hashlib.md5(md5file.read()).hexdigest()
        md5file.close()
        print md5, "\n\n"

print_md5(dirname=".")



PS: 二楼的办法也不错,这样操作可以直接引用楼主原来的代码

论坛徽章:
13
CU大牛徽章
日期:2013-03-14 14:14:082016科比退役纪念章
日期:2016-07-22 11:15:35数据库技术版块每日发帖之星
日期:2016-05-27 06:20:002015亚冠之吉达阿赫利
日期:2015-08-05 10:06:542015年亚洲杯之韩国
日期:2015-04-01 16:05:42双鱼座
日期:2014-11-13 11:04:24丑牛
日期:2014-07-25 17:29:54子鼠
日期:2014-04-25 12:25:45丑牛
日期:2014-04-17 08:35:48巨蟹座
日期:2014-04-16 16:50:05CU大牛徽章
日期:2013-03-14 14:14:29CU大牛徽章
日期:2013-03-14 14:14:26
5 [报告]
发表于 2016-01-05 14:36 |只看该作者
楼上这个办法好啊,
用hashlib ,就不需要subprocess 了
我后来用的代码比较蠢,
  1.         if filename.endswith(suffix):
  2.             if "'" in filename:
  3.                 filename=filename.replace("'","\\'")
  4.             if " " in filename:
  5.                 filename=filename.replace(" ","\ ")
  6.             cmd="md5sum {0}".format(filename)
  7.             fp=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP