我有一个目录,其中包含数千个名为数字.jpg(例如:100152.jpg
,100153.jpg
)。我不想复制此目录中的所有内容 — 只想复制名称与我创建的文本文件列表中的名称完全相同的文件。
这个较短的列表中大约有 36k 个名称——我想将大目录中所有与列表中同名的文件复制到单独的文件夹中。
我怎样才能做到这一点,而不逐一进行视窗系统?
答案1
您可以使用为/F并引用文件列表的完整路径,如下所示。
这将逐行读取您指向的文件列表的每一行,并将返回的值(每行的内容)迭代到复制命令进行相应的处理。
命令行语法
FOR /F "USEBACKQ TOKENS=*" %F IN ("C:\Folder\FileList.txt") DO XCOPY /F /Y "C:\SourceFolder\%~F" "C:\DestinationFolder\"
批处理脚本语法
@ECHO ON
SET FileList=C:\Folder\FileList.txt
SET Source=C:\SourceFolder
SET Destination=C:\DestinationFolder
FOR /F "USEBACKQ TOKENS=*" %%F IN ("%FileList%") DO XCOPY /F /Y "%Source%\%%~F" "%Destination%\"
GOTO :EOF
脚本逻辑说明
USEBACKQ
使用的选项为了循环将确保如果文件列表名称或其路径中有空格,则仍可以读取文件列表,并且需要用双引号括住文件列表路径
- 例如
SET FileList=C:\Folder Name\File List.txt
- 没有
USEBACKQ
为了在这种情况下循环就会出错
TOKENS=*
使用的选项为了循环将确保从文件列表中读取整个值,即使该值中包含空格
例如,文件列表的值为,
File 00 11.jpg
因此该值在一行上有一个空格
- 没有
TOKENS=*
为了循环只会返回第一个空格之前该行的值部分,而不是预期的值(即File
)即使在不需要时使用这些选项似乎也不会造成任何伤害,并且如果您在脚本组合中引入这样的值或变量,它已经能够相应地处理这种情况。
更多资源
答案2
bash
我随时都会用。
cat list.txt | xargs -I {} cp {} <destination folder>
cat list.txt | parallel cp {} <destination folder>
在 Windows 上,我会选择赛格威,但你可能会考虑康德,适用于 Windows 的 Git,西弗吉尼亚海岸和更多...
但你可以几乎轻松地Powershell
:
cat list.txt | ForEach {cp $_ <destination folder>}
显然,微软希望特定类别的用户能够放心使用 Powershell,因为它可以识别 UNIX 世界中的几个著名命令。这些命令只是等效 cmdlet 的别名,可以通过调用以下命令找到列表Get-Alias
(或者alias
如果你愿意,可以更简单):
cat -> Get-Content
clear -> Clear-Host
cp -> Copy-Item
curl -> Invoke-WebRequest
diff -> Compare-Object
echo -> Write-Output
history -> Get-History
kill -> Stop-Process
ls -> Get-ChildItem
man -> help
mount -> New-PSDrive
mv -> Move-Item
pwd -> Get-Location
rm -> Remove-Item
sleep -> Start-Sleep
wget -> Invoke-WebRequest