【问题标题】:Copying files with specific extension from a list (text file) of directories从目录列表(文本文件)复制具有特定扩展名的文件
【发布时间】:2018-02-05 19:43:19
【问题描述】:

我有一个包含某些目录列表的文本文件,我想将 *.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. 中的解决方案也适用于我。

【问题讨论】:

  • 你试过了吗? xcopy "%main_folder%\%%i\*.xlsx" "%my_folder%"
  • 也许可以试试xcopy "%main_folder%\%%i\"*.xlsx "%my_folder%"。现在*.xlsx 没有被引用,并且应该扩展(但我​​不再使用它来确定;-))。祝你好运。
  • @Masoud 它应该像这样工作。但问题出在你的 for 循环和逗号分隔的列表中。打开echo,你会在cmd上看到输出。它将整个列表作为一个文件夹。
  • @MatSnow 你是对的。我用回车分隔名称,shellter 的评论对我有用。谢谢。无论如何,如果你发布一个答案,我会接受它,这个帖子将被标记为已回答。

标签: powershell cygwin cmd cygwin xcopy


【解决方案1】:

这是一个 答案( 是一个高级,应该在标准 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 保留权限和时间戳。

【讨论】:

  • 是的,它比应有的复杂,但我想重新创建循环遍历项目然后复制每个项目的逻辑。我也无法让 rsync 在我的测试中正常工作;从理论上讲,像rsync -a --include '*.xlsx' --exclude '*' "$main_folder" "$my_folder/" 这样的东西应该可以解决问题,但我有一部分是错误的。
【解决方案2】:

在我的示例中出错的一件事是我如何使用文件夹名称设置文本文件。它应该设置为 回车 作为分隔符,而不是 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:\_M__\files"
for /f "tokens=*" %%i in (list.txt) DO (
    xcopy "%main_folder%\%%i\*.xlsx" "%my_folder%"
)

注意:如果你想直接在命令行中输入,你不需要为变量加倍%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2010-12-03
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多