磊磊映画 发表于 2018-7-26 08:58:18

帮忙写个批处理遍历当前目录所有文件及子文件夹复制文件

本帖最后由 磊磊映画 于 2018-7-26 11:18 编辑

自己写了一个批处理,只能处理当前文件夹下的文件,不能处理子文件夹的文件,每个文件都要重新执行一次很麻烦,大神帮忙写一下,我只要执行一次就能把当前目录及子文件夹的文件都复制了。


我只需要将    .a格式的文件 复制成.a_格式的文件即可 。   也就是说将所有.a的文件复制成.a_的文件
下面是我自己写的,大神只要加上遍历即可了。谢谢!

@echo off
for /r %%i in (*) do (copy*.a *.a_)
for /r %%i in (*) do (copy*.b *.b_)
for /r %%i in (*) do (copy*.j *.j_)



总结一下: 1.2Lpython的 方法和 8L脚本的方法都能解决我的问题,实现功能,都可以把所有文件子文件复制一遍,同时修改后缀
                2.区别是 批处理 复制完的文件的日期和源文件是一样的,python复制的文件的日期是复制时的当前时间 ,不是以前的时间。 批处理估计是底层操作,系统干预不了。

security 发表于 2018-7-26 10:13:52

本帖最后由 security 于 2018-7-27 11:43 编辑

我一直认为批处理不适合写复杂的应用,
也许你这个功能不算复杂吧,不过,我不会,也懒得去学。

人生苦短,我用 Python 2.7(需要安装 Python 2.7),帮你写一个相同的功能吧(把 *.a 复制为 *.a_):
copy_files.py:
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from shutil import *
import sys
import os

def main(argv):
    print("")
   
    # Collect arguments
    if len(sys.argv) != 2:
      print("usage: copy_files.py <root_dir>")
      sys.exit(2)
   
    root_dir = argv
   
    # Translate
    for parent, dirnames, filenames in os.walk(root_dir):
      for filename in filenames:
            old_full_filename = os.path.join(parent, filename)
            old_full_filename_splittext = os.path.splitext(old_full_filename)
            if old_full_filename_splittext == ".a":
                copyfile(old_full_filename, old_full_filename_splittext + ".a_")
   
if __name__ == "__main__":
    main(sys.argv)

对应写一个批处理,放在想要工作的文件夹目录内,双击此批处理,就会对此文件内的所有文件执行操作。
copy_files.bat:@echo off

cd /d %~dp0

python copy_files.py "%cd%"

pause

@echo on

源码包见:

磊磊映画 发表于 2018-7-26 10:24:46

感谢 1L 完美解决了我的问题,正好我的电脑上安装了 PYTHON3.6 下载下来就直接用了,效果很好   

我这个需求感觉不复杂   批处理 应该一句话的事,可惜我不会自己搞了半天也没出来。

再次感谢!

cocom 发表于 2018-7-26 10:30:04

有一个XCOPY命令,是DOS和WINDOWS CMD下的,和COPY一样,但功能多一点。
可以用: COPY SRC DES /S, 即可拷贝该目录与该目录下的所有子目录。

可以用XCOPY/?得到该命令的所有参数

磊磊映画 发表于 2018-7-26 10:30:43

本帖最后由 磊磊映画 于 2018-7-26 10:31 编辑

如果文件有.b .c 格式的文件也要处理的话该如何加呢?
我加了一下 ,但是执行的时候报错了 。#! /usr/bin/env python
# -*- coding: utf-8 -*-

from shutil import *
import sys
import os

def main(argv):
    print("")
   
    # Collect arguments
    if len(sys.argv) != 2:
      print("usage: copy_files.py <root_dir>")
      sys.exit(2)
   
    root_dir = argv
   
    # Translate all opened cache files's format to bin
    for parent, dirnames, filenames in os.walk(root_dir):
      for filename in filenames:
            old_full_filename = os.path.join(parent, filename)
            old_full_filename_splittext = os.path.splitext(old_full_filename)
            if old_full_filename_splittext == ".a":
                copyfile(old_full_filename, old_full_filename_splittext + ".a_")
                  else if old_full_filename_splittext == ".b":
                copyfile(old_full_filename, old_full_filename_splittext + ".b_")
            else if old_full_filename_splittext == ".j":
                copyfile(old_full_filename, old_full_filename_splittext + ".j_")                               
   
if __name__ == "__main__":
    main(sys.argv)

磊磊映画 发表于 2018-7-26 10:32:31

cocom 发表于 2018-7-26 10:30
有一个XCOPY命令,是DOS和WINDOWS CMD下的,和COPY一样,但功能多一点。
可以用: COPY SRC DES /S, 即 ...

只拷贝指定格式的文件呢 如何加

security 发表于 2018-7-26 10:40:49

磊磊映画 发表于 2018-7-26 10:30
如果文件有.b .c 格式的文件也要处理的话该如何加呢?
我加了一下 ,但是执行的时候报错了 。 ...

你的逻辑应该是对的。

你检查一下,你的 TAB 键吧,把 TAB 键转换为 4 个 space。
我给你的源码,缩进用的都是 space。
Python 非常变态,TAB 和 space 不能混用,缩进要吗全是 TAB,要吗全是 space。

takashiki 发表于 2018-7-26 10:41:07

批处理来了,就是这样:@echo off
for /D /R . %%i in (*, .) do (copy "%%i\*.a" "%%i\*.a_")
for /D /R . %%i in (*, .) do (copy "%%i\*.b" "%%i\*.b_")
for /D /R . %%i in (*, .) do (copy "%%i\*.c" "%%i\*.c_")

security 发表于 2018-7-26 10:43:17

takashiki 发表于 2018-7-26 10:41
批处理来了,就是这样:

好棒好棒!学习一下。

security 发表于 2018-7-26 10:50:35

磊磊映画 发表于 2018-7-26 10:30
如果文件有.b .c 格式的文件也要处理的话该如何加呢?
我加了一下 ,但是执行的时候报错了 。 ...

给你对应的源码比对一下,要注意缩进对齐、以及 TAB 和 space 不能混用。
coye_files.py:
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from shutil import *
import sys
import os

def main(argv):
    print("")
   
    # Collect arguments
    if len(sys.argv) != 2:
      print("usage: copy_files.py <root_dir>")
      sys.exit(2)
   
    root_dir = argv
   
    # Translate
    for parent, dirnames, filenames in os.walk(root_dir):
      for filename in filenames:
            old_full_filename = os.path.join(parent, filename)
            old_full_filename_splittext = os.path.splitext(old_full_filename)
            if old_full_filename_splittext == ".a":
                copyfile(old_full_filename, old_full_filename_splittext + ".a_")
            if old_full_filename_splittext == ".b":
                copyfile(old_full_filename, old_full_filename_splittext + ".b_")
            if old_full_filename_splittext == ".c":
                copyfile(old_full_filename, old_full_filename_splittext + ".c_")
   
if __name__ == "__main__":
    main(sys.argv)

源码:



磊磊映画 发表于 2018-7-26 11:14:51

本帖最后由 磊磊映画 于 2018-7-26 11:22 编辑

takashiki 发表于 2018-7-26 10:41
批处理来了,就是这样:

膜拜大神感谢完美解决了我的问题!

Nuker 发表于 2018-7-26 11:38:51

一句话的事:
for /r %%f in (*.a) do copy %%f %%f_

磊磊映画 发表于 2018-7-26 11:47:52

Nuker 发表于 2018-7-26 11:38
一句话的事:
for /r %%f in (*.a) do copy %%f %%f_

感谢感谢   批处理很强大,楼主也是大神

plb83 发表于 2018-7-26 11:50:56

坛里牛人就是多

security 发表于 2018-7-26 11:53:22

Nuker 发表于 2018-7-26 11:38
一句话的事:
for /r %%f in (*.a) do copy %%f %%f_

标记一下,
看来,有空也得花点时间看看批处理了。
不过现在我写批处理是越来越少了,更多用 Python 来做。

磊磊映画 发表于 2018-7-26 12:49:45

security 发表于 2018-7-26 11:53
标记一下,
看来,有空也得花点时间看看批处理了。
不过现在我写批处理是越来越少了,更多用 Python 来做 ...

像你开头说的 批处理只适合干的简单的事
页: [1]
查看完整版本: 帮忙写个批处理遍历当前目录所有文件及子文件夹复制文件