批处理:从目录列表中复制某些文件

问题描述 投票:-1回答:2

我有一个文本文件,其中包含某些目录的列表,我想将*.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 cmd copy cygwin
2个回答
2
投票

这是一个答案(是一个先进的,当标准Posix shell(/bin/sh)不足时应该保留)。请注意,斜杠是有意颠倒的。

我看到你的list.txt中的格式用逗号和空格分隔。我将假设这是字面意思,并且没有你到目前为止所尝试过的原因。因此,我用明确的假设解析它,逗号然后空格()是一个分隔符,并且没有办法逃避它们(例如,如果你有一个名为apples, oranges.txt的文件,那么我的代码会错误地解析名为applesoranges.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保留权限和时间戳。


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%"
)

注意:如果要直接在命令行中键入此内容,则不需要为变量添加双%

© www.soinside.com 2019 - 2024. All rights reserved.