我有一个文本文件,其中包含某些目录的列表,我想将*.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
,因为我不希望子文件中的文件目录。
P.S。 powershell或cygwin中的解决方案也适用于我。
答案 0 :(得分:2)
这是一个cygwin shell答案(bash是一个高级shell,应该在标准Posix shell(/bin/sh
)不足时保留。请注意,斜杠是有意颠倒的。
我看到list.txt
中的格式用逗号和空格分隔。我将假设这是字面意思,并且原因是你到目前为止没有尝试过的。因此,我正在使用逗号然后空格(,
)作为分隔符并且无法转义它们的明确假设进行解析(例如,如果您有一个名为apples, oranges.txt
的文件,那么我的代码会错误地解析名为apples
和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
保留权限和时间戳。
答案 1 :(得分:0)
在我的示例中出现错误的一件事是我如何使用文件夹名称设置文本文件。它应该用回车符设置为分隔符而不是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%"
)
注意: 如果您想直接在命令行中输入此内容,则不需要为变量加倍%
。