从目录列表(文本文件)中复制具有特定扩展名的文件
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
传递给此命令。
注:我没有故意用/S
和xcopy
切换,因为我不想子目录中的文件。
P.S. powershell or cygwin 中的解决方案也适用于我。
这是一个 cygwinshell answer (bash is an advanced shell,当标准 Posix shell (/bin/sh
) 不足时,应该保留它)。请注意,斜线是有意反转的。
我看到您 list.txt
中的格式是用逗号和白色 space 分隔的。我将假设这是字面意思,并且您到目前为止所尝试的 none 的原因是有效的。因此,我在解析它时明确假设逗号然后是 space (,
) 是一个分隔符,并且没有办法转义它们(例如,如果你有一个名为 [=14= 的文件] 那么我的代码会错误地解析名为 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
)。如果命令行参数包含 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%"
)
注意:如果你想直接在命令行中输入这个,你不需要双重%
对于变量。
我有一个包含特定目录列表的文本文件,我想将 *.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
传递给此命令。
注:我没有故意用/S
和xcopy
切换,因为我不想子目录中的文件。
P.S. powershell or cygwin 中的解决方案也适用于我。
这是一个 cygwinshell answer (bash is an advanced shell,当标准 Posix shell (/bin/sh
) 不足时,应该保留它)。请注意,斜线是有意反转的。
我看到您 list.txt
中的格式是用逗号和白色 space 分隔的。我将假设这是字面意思,并且您到目前为止所尝试的 none 的原因是有效的。因此,我在解析它时明确假设逗号然后是 space (,
) 是一个分隔符,并且没有办法转义它们(例如,如果你有一个名为 [=14= 的文件] 那么我的代码会错误地解析名为 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
)。如果命令行参数包含 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%"
)
注意:如果你想直接在命令行中输入这个,你不需要双重%
对于变量。