回答

回答

假设我有以下树:

├───animals
│   │   hippopotamus.txt
│   │   lion.txt
│   │
│   └───dog
│           poodle.txt
│           terrier.txt
└───food
    ├───fruit
    │       apple.txt
    │       orange.txt
    └───vegetables
            borcolli.txt
            carrot.txt
            corn.txt

我应该使用什么命令来创建一个包含所有 .txt 文件但不包含子文件夹的目录,本质上就是“展平”树。

答案1

回答

假设您心中有一个目标目录 (C:\Target),并且所有 .txt 文件都在 C:\Tree 目录下,则以下命令将获取所有 .txt 文件的列表并将它们复制到您想要的目的地:

for /F "delims=" %a in ('dir /s /b "C:\Tree\*.txt" ') do (copy "%a" "C:\Target")

我用双引号将可能包含空格的参数括起来。

解释

for /F

执行 for 循环解析文本。默认情况下,标记将按空格拆分为变量 %a、%b、%c 等。由于我们不希望出现这种行为,因此我指定了:

"delims="

这意味着没有分隔符。%a 将是包含命令输出的每一行文本的变量。我使用的命令是:

dir /s /b "C:\Tree\*.txt"

这将列出 C:\Tree 文件夹下所有与 *.txt 匹配的文件的目录。/s 标志以递归方式执行,搜索所有子目录/子文件夹。/b 标志以“裸”格式输出列表,基本上只列出文件和路径。输出如下所示:

C:\Tree\animals\hippopotamus.txt
C:\Tree\animals\lion.txt
C:\Tree\animals\dog\poodle.txt
C:\Tree\animals\dog\terrier.txt
C:\Tree\food\fruit\apple.txt
C:\Tree\food\fruit\orange.txt
C:\Tree\food\vegetables\borcolli.txt
C:\Tree\food\vegetables\carrot.txt
C:\Tree\food\vegetables\corn.txt

而且当然:

copy "%a" "C:\Target"

将 %a 变量所表示的文件复制到 C:\Target 目录。for 循环基本上执行以下命令:

copy "C:\Tree\animals\hippopotamus.txt" "C:\Target"
copy "C:\Tree\animals\lion.txt" "C:\Target"
copy "C:\Tree\animals\dog\poodle.txt" "C:\Target"
copy "C:\Tree\animals\dog\terrier.txt" "C:\Target"
copy "C:\Tree\food\fruit\apple.txt" "C:\Target"
copy "C:\Tree\food\fruit\orange.txt" "C:\Target"
copy "C:\Tree\food\vegetables\borcolli.txt" "C:\Target"
copy "C:\Tree\food\vegetables\carrot.txt" "C:\Target"
copy "C:\Tree\food\vegetables\corn.txt" "C:\Target"

有关 Windows 命令提示符 (CMD) 中的 DIR 选项或 FOR 循环的更多帮助,您可以键入help dirhelp for。请注意,FOR 循环帮助页面相当长。;)

答案2

PowerShell 解决方案:

mkdir C:\AllTxt ; gci C:\Install *.txt -Recurse | copy-item -Destination C:\AllTxt -Force 
  • mkdir创建新目录,例如C:\AllTxt
  • gciC:\install递归获取树结构顶层目录中的所有 txt 文件
  • copy-item将文件复制到目标

相关内容