假设我有以下树:
├───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 dir
或help for
。请注意,FOR 循环帮助页面相当长。;)
答案2
PowerShell 解决方案:
mkdir C:\AllTxt ; gci C:\Install *.txt -Recurse | copy-item -Destination C:\AllTxt -Force
mkdir
创建新目录,例如C:\AllTxt
gci
C:\install
递归获取树结构顶层目录中的所有 txt 文件copy-item
将文件复制到目标