使用txt中的部分文件名列表将文件从一个文件夹复制到另一个文件夹


0

我有大量图像存储在一个文件夹中,并通过它们进行排序,以选择复制到某些文件夹,如“scenery”或“technical”,并为文本文件中的每个文件夹创建一个部分文件名列表。例如。Scenery.txt

4811
4819
4820

这些是唯一的文件编号,它们是完整文件名的一部分,例如:

C:\Users\drewb\Pictures\2018_08_Inuvik\All\DSC_4811.jpg

我有一个PowerShell中的脚本,当我有一个.txt文件中列出的完整文件名列表时,它对我有用,但由于我只写了图片编号,因此节省了大量照片。我希望有一种方法可以创建这个列表的数组并将其作为循环中的完整文件名中的变量提供,但任何建议都值得赞赏。

在.txt中使用全名工作的代码是

Get-Content C:\Users\drewb\Pictures\2018_08_Inuvik\Technical.txt | ForEach-Object {copy-item $_ C:\Users\drewb\Pictures\2018_08_Inuvik\Technical}

已解决:我通过将文件路径连接到名称和excel中的文件扩展名来解决它,然后使用我之前使用的PS脚本。但是,我觉得必须有更直接的方式来编写脚本。


文件中的图像编号是分别在新行上还是彼此相邻?
SimonS

我相信你需要一个比CMD或PowerShell更智能的工具。
安德烈亚斯

图像编号位于每个新行上。你有什么想法可以使用吗?
Drew Branson

@DrewBranson我不是100%理解这个问题。哪些图片必须放在哪个文件夹中?你想创建一个文件夹,例如48114811FileName中的所有文件都应该进入这个文件夹?请详细说明一下,编辑你的问题
西蒙斯

你的问题需要更清晰一些。似乎Powershell是一个很好的解决方案,但如果没有其他解释,很难回答。如果它们的名称与示例图像的名称相同,则可以从图像中提取所有数值,如下所示:gci | select -ExpandProperty BaseName | % { $_.Split('_')[1] }

Answers:


1

简短的回答

如果当前目录包含文件名遵循相同模式DSC_XXXX.jpg(其中XXXX是数字)的图片和名为Technical.txt包含其中一些数字的文件,则以下命令将复制到该Technical文件夹(假设它存在于当前目录中)所有文件Technical.txt文件中提供了一个数字:

Get-Content Technical.txt | ForEach-Object { Copy-Item "DSC_$_.jpg" Technical }

如果Technical.txt和图片文件和Technical目录不在当前目录中,则必须提供完整或相对路径,例如:

Get-Content c:\path1\to\Technical.txt | ForEach-Object { Copy-Item "c:\path2\to\pictures\DSC_$_.jpg" c:\path3\to\Technical }

说明

  • "DSC_$_.jpg"命令中的表达式用于根据从Technical.txt文件读取的数字生成图片文件名,该文件是当前管道对象(即$_)。它只是添加DSC_作为前缀和.jpg扩展名。
  • Get-Content读取Technical.txt文件的内容。
  • ForEach-Object{}为管道中的每个对象执行其脚本块参数(用大括号括起来,即),在这种情况下,返回的每行文本Get-Content

测试此解决方案(在线或本地)

最简单的方法是在线尝试此解决方案

否则,可以使用以下代码片段在当前目录中创建一个test文件夹,其中包含一个示例Technical.txt文件和伪图片文件,该文件遵循本答案中提到的模式以及一个空Technical目录(注意:如果已经存在,则必须更改.\test为其他内容test在工作目录中有一个文件夹:

mkdir -ErrorAction SilentlyContinue .\test\Technical
Out-File .\test\DSC_4811.jpg; Out-File .\test\DSC_4812.jpg; Out-File .\test\DSC_4813.jpg;
Out-File .\test\DSC_4814.jpg; Out-File .\test\DSC_4819.jpg; Out-File .\test\DSC_4820.jpg;
"4811`n4819`n4820" > .\test\Technical.txt

(在第三行中,`n表示行尾字符(back-tick(`)是PowerShell中的转义字符)。

它生成以下文件:

.\test\DSC_4811.jpg    .\test\DSC_4812.jpg    .\test\DSC_4813.jpg
.\test\DSC_4814.jpg    .\test\DSC_4819.jpg    .\test\DSC_4820.jpg
.\test\Technical.txt

在作为答案提供的命令执行(Get-Content .\test\Technical.txt | ForEach-Object { Copy-Item ".\test\DSC_$_.jpg" .\test\Technical })后,文件是:

.\test\DSC_4811.jpg              .\test\DSC_4812.jpg              .\test\DSC_4813.jpg
.\test\DSC_4814.jpg              .\test\DSC_4819.jpg              .\test\DSC_4820.jpg
.\test\Technical.txt
.\test\Technical\DSC_4811.jpg    .\test\Technical\DSC_4819.jpg    .\test\Technical\DSC_4820.jpg

清理:

ri -Recurse .\test
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.