如何根据指定目录从一个文件夹中(含子文件夹)中搜索对应文件并自动复制至新路径下?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据指定目录从一个文件夹中(含子文件夹)中搜索对应文件并自动复制至新路径下?相关的知识,希望对你有一定的参考价值。

如图:图1是目录,A列为序号,B列为材料名称,另有一个含子文件夹的大文件夹(乱七八糟东西很多),需要从大文件夹中按照图1 B列内容搜索文件(基本都是PDF),然后复制至图2中对应的文件夹中。以图1的0009行为例,从大文件夹中搜索“846”,将搜索出的PDF放到图2中的“0009”文件夹中。求个自动化方法。

不清楚你的实际文件/情况,仅以问题中的样例说明及猜测为据;以下代码复制粘贴到记事本,另存为xx.bat,编码选ANSI

@echo off&cd /d "%~dp0"&mode con lines=5000
rem 根据给出的对应关系,从一个目录里查找出指定名称的文件,并拷贝/复制到另一个目录的指定子文件夹里
set #=Any question&set _=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%_% %z%
set "oldfolder=D:\\大文件夹"
set "newfolder=I:\\材料"
if not exist "%oldfolder%" (echo;"%oldfolder%" 未找到&pause&exit)
for /f "delims=:" %%a in ('type "%~f0"^|findstr /in "^exit$"') do set "last=%%a"
for /f "skip=%last% tokens=1* delims==" %%a in ('type "%~f0"') do (
    for /f "delims=" %%c in ('dir /a-d-h/b/s "%oldfolder%\\%%~b.*" 2^>nul') do (
        echo;"%%~c" --^> "%oldfolder%\\%%~a"
    )
)
echo;%#% +%$%%$%/%_% %z%
pause
exit
0001=转征函【2016】1093号
0002=转征函[2017]1446号
0003=转征函[2015]1122号
0004=转征函[2017]1446号
0005=转征函[2017]1446号
0006=转征函[2012]846
0007=转征函[2015]1122号

追问

大神你好,按照上述方法做了,显示了过程(就是那个黑色运行框),但是结果各个文件夹里啥都没有,啥情况诶

追答

按运行代码后窗口标题栏中的提示联系我

参考技术A rem 注意:需要保存为批处理文件,如:c.bat
rem 用法:efi.txt(ANSI编码)中存储需要复制的文件及路径,每个文件一行,如:C:\BOOT\BCD
rem DD为目标文件夹,本例结果:c:\BCDBOOT\BOOT\BCD
rem 根据需要修改目标路径DD
set DD=c:\BCDBOOT
for /f %%i in (efi.txt) do (
pushd %%i 2>nul && (
echo %%~pi is 目录
md %DD%%%~pi
popd ) || (
md %DD%%%~pi
copy %%i %DD%%%~pnxi
)

模块的搜索路径

模块搜索路径的顺序(掌握)

模块其实就是一个文件,如果要执行文件,首先就需要找到模块的路径(某个文件夹)。如果模块的文件路径和执行文件不在同一个文件目录下,我们就需要指定模块的路径。

模块的搜索路径指的就是在导入模块时需要检索的文件夹。

导入模块时查找模块的顺序是:

  1. 先从内存中已经导入的模块中寻找
  2. 内置的模块
  3. 环境变量sys.path中找
import sys
print(f"sys.path: {sys.path}")

'''
['/Users/mac/Desktop/video/python/day16', 
'/Users/mac/Desktop/video/python', 
'/Applications/anaconda3/lib/python36.zip', 
'/Applications/anaconda3/lib/python3.6', 
'/Applications/anaconda3/lib/python3.6/lib-dynload', 
'/Applications/anaconda3/lib/python3.6/site-packages', 
'/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend']
'''

强调:sys.path的第一个值是当前执行文件的所在的文件夹

技术图片

验证先从内存中找

如果我们在运行run.py文件的时候,快速删除mmm.py文件,我们会发现文件会继续运行,而不会报错,因为mmm已经被导入内存当中。如果我们再一次运行run.py时会报错,因为mmm.py已经被删除了。

# mmm.py

def f1():
    print('from mmm.py f1')
# run.py
import time
import mmm

time.sleep(10)
import mmm
mmm.f1()  # from mmm.py f1

验证先从内置中找

# time.py
print('from time.py')
# run.py
import time
print(time)  # <module 'time' (built-in)>

验证从sys.path中找

如果mmm.py在/Users/mac/Desktop/video/python路径下,而执行文件路径为/Users/mac/Desktop/video/python/day16,如果普通导入一定会报错,我们可以把/Users/mac/Desktop/video/python添加到环境变量sys.path中,防止报错。

# run.py
import sys
sys.path.append(r'/Users/mac/Desktop/video/python')
print(sys.path)

import mmm
mmm.f1()

搜索路径以执行文件为准(掌握)

技术图片

技术图片

假设我们有上述的目录结构的文件,文件内代码分别是:

# m1.py

import sys
print('模块m1中查看的结果',sys.path)
# import m2
from dir1 import m2
m2.f2()
# m2.py

import sys
print(sys.path)

def f2():
    print('from f2')
# run.py
import sys
print('执行文件查看的结果:',sys.path)
from dir1 import m1

其中run.py文件的执行路径是/Users/mac/Desktop/video/python/day16/模块搜索路径练习,如果我们在m1.py中直接使用import m2导入m2会报错,而使用from dir1 import m2导入m2则会成功,因为搜索路径以执行文件为准,dir1和run.py是同目录下的,因此run.py的环境变量能找到dir1;而m2和run.py不是同目录下的,因此run.py的环境变量无法直接找到m2。

技术图片

以上是关于如何根据指定目录从一个文件夹中(含子文件夹)中搜索对应文件并自动复制至新路径下?的主要内容,如果未能解决你的问题,请参考以下文章

linux 怎么 查找一个指定的文件 和 文件夹

Linux中如何查找文件夹 ?

黑猴子的家:Git 提交空文件夹

“查找:路径必须在表达式之前:”如何指定在当前目录中也可以找到文件的递归搜索?

linux命令中whichwhereislocate有什么区别?

模块的搜索路径