从目录列表(文本文件)中复制具有特定扩展名的文件

Copying files with specific extension from a list (text file) of directories

我有一个包含特定目录列表的文本文件,我想将 *.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:\_M__\files"
for /f "tokens=*" %%i in (list.txt) DO (
    xcopy "%main_folder%\%%i" "%my_folder%"
)

所以我想查看的文件夹是 \internal.company.com\project folder\PT_NAK01

我不知道如何将特定的扩展名 *.xlsx 传递给此命令。

注:我没有故意用/Sxcopy切换,因为我不想子目录中的文件。

P.S. or 中的解决方案也适用于我。

这是一个 answer ( is an advanced ,当标准 Posix shell (/bin/sh) 不足时,应该保留它)。请注意,斜线是有意反转的。

我看到您 list.txt 中的格式是用逗号和白色 space 分隔的。我将假设这是字面意思,并且您到目前为止所尝试的 none 的原因是有效的。因此,我在解析它时明确假设逗号然后是 space () 是一个分隔符,并且没有办法转义它们(例如,如果你有一个名为 [=14= 的文件] 那么我的代码会错误地解析名为 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)。如果命令行参数包含 space 或可解释的字符,请不要忘记引用它们。

确定您的源和目标后,我尝试将目录更改为源目录。如果失败,脚本将以相同的退出代码停止。

现在进入循环。我已经将输入字段分隔符 ($IFS) 更改为逗号和 space () 我们之前讨论过,然后将 list.txt 的内容粘贴到它的参数中, 然后是一层深度的要求(包括 PT_NAK05/foobar/baz.xlsx,使用 -maxdepth 2 或完全删除该子句以递归查看文件树),然后是名称匹配的要求 *.xlsx (这是转义的,因为你的 shell 否则会假设你在谈论本地目录)。然后将其输出逐行读入循环 $xlsx。如果目标的父目录不存在,我们将在新的目标位置重新创建目标的父目录,然后将文件复制到该位置。 cp -a 保留权限和时间戳。

在我的示例中出错的一件事是我如何使用文件夹名称设置文本文件。它应该设置为 carriage return 作为分隔符而不是 comma-separated 条目。

PT_NAK01
PT_NAK04
PT_NAK05

等等

有了这个,这个批处理文件(参考 )可以很好地解决这个问题。

@echo off
set main_folder="\internal.company.com\project folder\"
set my_folder="C:\_M__\files"
for /f "tokens=*" %%i in (list.txt) DO (
    xcopy "%main_folder%\%%i\*.xlsx" "%my_folder%"
)

注意:如果你想直接在命令行中输入这个,你不需要双重%对于变量。