批次:从目录
列表复制某些文件我有,我想从他们*.xlsx
文件复制到另一个目录某些目录的列表的文本文件。批次:从目录
这是怎样的文本文件(list.txt
)设置:
PT_NAK01, PT_NAK04, PT_NAK05, PT_JAR03
我想用这样的利用复制的文件类似如下:
@echo off
set main_folder="\\internal.company.com\project folder\"
set my_folder="C:\_Masoud\files"
for /f "tokens=*" %%i in (list.txt) DO (
xcopy "%main_folder%\%%i" "%my_folder%"
)
所以我想查看的文件夹将是\\internal.company.com\project folder\PT_NAK01
等
我不知道的是如何通过特定扩展名*.xlsx
到这个命令。
注:我没有用/S
交换机xcopy
故意,因为我不想在子目录中的文件。
附:powershell或cygwin的解决方案也适用于我。
这是一个cygwinshell答案(bash是一种先进的shell应该用于当标准的Posix壳(/bin/sh
)不足以被保留)。请注意,斜杠是有意颠倒的。
我看到你的list.txt
格式被分隔用逗号和空格。我会假设这是字面的,而且迄今为止你所尝试过的任何一个原因都不适用。因此,我与明确的假设分析它是逗号,然后空间(,
)是一个分隔符,没有办法逃避他们(例如,如果你有一个名为apples, oranges.txt
文件,然后我的代码会错误解析命名和oranges.txt
文件)。
#!/bin/sh
main_folder="${1:-//internal.company.com/project folder}"
my_folder="${2:-c:/_Masoud/files}"
cd "$main_folder" || exit $?
IFS=', ' find $(cat list.txt) -maxdepth 1 -name \*.xlsx |while IFS= read xlsx; do
mkdir -p "$my_folder/${xlsx%/*}"
cp -a "$xlsx" "$my_folder/$xlsx"
done
我已经做了一些额外的工作,为您作出这个更抽象。 $main_folder
从你的第一个参数取(缺少参数将默认为//internal.company.com/project folder
)和$my_folder
从你的第二个参数取(如果缺失,则默认为c:/_Masoud/files
)。不要忘记引用你的命令行参数,如果它们包含空格或可解释的字符。
确定您的源和目标后,然后尝试将目录更改为源目录。如果失败,脚本将以相同的退出码停止。
现在为循环。我已经改变了输入分隔符($IFS
)是逗号和空格(,
),我们前面谈到的,然后胶合list.txt
内容到它的参数,其次是一个深层次的需求(包括PT_NAK05/foobar/baz.xlsx
,使用-maxdepth 2
或者只是完全删除该子句以递归查看文件树),然后是匹配*.xlsx
的名称的要求(因为您的shell会假设您正在谈论本地目录,所以这会被转义)。然后将这个输出作为$xlsx
逐行读入循环。如果目标的目标目标不存在,我们将重新创建目标的父目录,然后将文件复制到该目标位置。 cp -a
保留权限和时间戳。
是的,它比它应该更复杂,但我想重新创建循环播放项目然后复制每个项目的逻辑。我也无法让rsync在我的测试中正常工作;理论上,像'rsync -a --include'* .xlsx'--exclude'*'“$ main_folder”“$ my_folder /”'应该可以做到这一点,但是我有一些错误。 –
在我的示例中发生错误的一件事是我如何使用文件夹名称设置文本文件。应使用回车符作为分隔符而不是comma-separated
条目。
PT_NAK01
PT_NAK04
PT_NAK05
等
说完,这个批处理文件(参考MatSnow's and shellter's comments)对这个问题的目的,工作正常。
@echo off
set main_folder="\\internal.company.com\project folder\"
set my_folder="C:\_Masoud\files"
for /f "tokens=*" %%i in (list.txt) DO (
xcopy "%main_folder%\%%i\*.xlsx" "%my_folder%"
)
注:如果你想这种类型直接进入命令行模式,你不需要双%
的变量。
你试过这个吗? 'xcopy“%main_folder%\ %% i \ *。xlsx”“%my_folder%”' – MatSnow
@MatSnow它找不到文件并且什么也不复制。我不认为你可以将通配符作为文本传递。不是cmd tho的专家。 – Masoud
也许试试'xcopy“%main_folder%\ %% i \”*。xlsx“%my_folder%”'。现在'* .xlsx'没有被引用,并且应该扩展(但是我不再使用这个足以确定;-))。祝你好运。 – shellter