从列表中复制具有特定名称的文件

从列表中复制具有特定名称的文件

我有一个目录,其中包含数千个名为数字.jpg(例如:100152.jpg100153.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>

或者,因为我更喜欢parallel超过xargs

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

相关内容