Используйте список частичных имен файлов в TXT для копирования файлов из одной папки в другую

378
Drew Branson

У меня есть большое количество изображений, хранящихся в одной папке и отсортированных по ним, чтобы выбрать, какие из них копировать в определенные папки, такие как «декорации» или «технические», и создал список частичных имен файлов для каждой папки в текстовом файле. например. 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 

РЕШЕНО: Я решил это, объединив путь к файлам с именами и расширением файла в Excel, а затем использовал сценарий PS, который я использовал ранее. Однако я чувствую, что должен быть более прямой способ, которым это может быть написано в сценарии.

0
номера изображений в файле находятся на новой строке или рядом друг с другом? SimonS 5 лет назад 0
Я считаю, что вам нужен более умный инструмент, чем просто CMD или powershell. Andreas 5 лет назад 0
Номера изображений указаны на каждой новой строке. У вас есть идеи, что я мог бы использовать? Drew Branson 5 лет назад 0
@DrewBranson Я не понимаю вопроса на 100%. какие картинки должны идти в какую папку? Вы хотите создать папку, например `4811`, и все файлы, которые имеют` 4811` в своем FileName, должны войти в эту папку? пожалуйста, уточните немного, отредактировав свой вопрос SimonS 5 лет назад 0
Ваш вопрос нуждается в большей ясности. Похоже, что Powershell - хорошее решение, но сложно ответить без другого объяснения. Вы можете извлечь все числовые значения из ваших изображений, если все они названы так же, как ваш пример изображения, например: `gci | выберите -ExpandProperty BaseName | % {$ _. Split ('_') [1]} `. root 5 лет назад 0

1 ответ на вопрос

1
Youssef Abidi

Короткий ответ

Если текущий каталог содержит изображения, имена файлов которых следуют одному и тому же шаблону 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представляет символ конца строки (обратная галочка ( `) является escape-символом в 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 

Похожие вопросы