我是python的新手,我正在尝试构建一个小的脚本,该脚本可以从整个服务器上收集图像,我有一定的图像命名:
AMZ_1004.jpg
AMZ_1272.jpg
GOO_1.jpeg
GOO_2.png
我希望脚本浏览每个目录并将文件复制(而不移动)到AMZ&GOO中
import shutil,os
goo_dst = '/home/usr2/Pictures/GOO'
amz_dst = '/home/usr2/Pictures/AMZ'
os.makedirs(goo_dst,exist_ok=1)
os.makedirs(amz_dst,exist_ok=1)
for root, dirs, files in os.walk('/'):
for name in files:
path = os.path.join(root, name)
if name.startswith('GOO_') and (name.endswith('.jpg') or name.endswith('.jpeg') or name.endswith('.png')):
shutil.copyfile(path, goo_dst)
elif name.startswith('AMZ_') and name.endswith('.jpg'):
shutil.copyfile(path, amz_dst)
脚本可以正常运行,有没有办法加快过程?
如果重要的话,脚本可以在Arch Linux上运行
您可以对脚本进行的最大优化不是在文件系统根目录上开始搜索。
此方法遍历了很多不是文件的内容(例如/dev
和/proc
文件夹),也遍历了文件不太可能存在的系统文件夹。(您真的不希望有任何图像在下方/bin
或/usr/bin
正确吗?)
尝试缩小实际搜索路径,例如/var/www
Apache文件夹所在的位置。
另一个优化可能根本不使用Python,而是直接使用shell脚本:
#!/bin/sh
GOO_DST='/home/usr2/Pictures/GOO'
AMZ_DST='/home/usr2/Pictures/AMZ'
mkdir -p ${GOO_DST}
mkdir -p ${AMZ_DST}
find / -type f -name 'GOO_*.jpg' -o -name 'GOO_*.jpeg' -o -name 'GOO_*.png' -exec cp {} ${GOO_DST} \;
find / -type f -name 'AMZ_*.jpg' -exec cp {} ${AMZ_DST} \;
该find
实用程序应比手动遍历为您提供更快的结果。
如果您坚持使用Python,请至少移动,path = os.path.join(root, name)
以避免对不相关的文件(大多数文件)进行额外的工作。这是一个很小的优化,但仍然可以提供帮助。
另一个选择是使用多线程并行化搜索,但是您将需要手动确定每个线程将搜索文件系统的哪一部分。
如果有2个线程经过相同的文件夹,则将浪费更多时间。另外,请注意,对该脚本进行多线程处理可能会导致其在运行时占用更多CPU。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句