Команда Windows dir выводит файлы с абсолютным путем, требуется относительный путь.

Вопрос или проблема

Я хотел бы перечислить все имена файлов всех файлов с определённым расширением в структуре каталогов и записать это в файл. Вот что я достиг:

dir /B /S *.ext > list.filenames

Это дает мне список всех файлов, которые я хочу видеть в списке. Но он перечисляет файлы с абсолютным путем, включая букву диска и полный путь. Мне нужен относительный путь без буквы диска и пути к рабочему каталогу.

Я думал о двух возможностях, но не нашёл решения:

  1. Сказать dir выводить только относительные пути
  2. Удалить ненужную часть пути из созданного файла.

Обе задачи мне не удалось выполнить. Есть идеи?

Вот решение, которое вызывает PowerShell, хотя, вероятно, есть и другие лучшие способы:

dir /B /S *.ext > abs.filenames
set search="%cd%\"
powershell -Command "(gc abs.filenames) -replace [regex]::escape(%search%), '' " 2>&1 > list.filenames
type list.filenames

Обратите внимание, что Windows Powershell может быть недоступен, так как он является одной из необязательных функций, найденных в разделе Программы и компоненты.

Подсистема Windows для Linux или Cygwin на Windows предоставила бы вам доступ к множеству лучших инструментов для этой задачи, например, с помощью find:

find . -name \*.ext > list.filenames

Вы можете попробовать это:

Откройте PowerShell:

Win+R>>введите powershell>>Ctrl+Shift+Enter

Затем используйте следующие команды:

$path="путь\к\папке"
(Get-ChildItem -Path $path -File -Filter "*.ext" -Force -Recurse).FullName | %{$_.Replace($path)}

Не забудьте заменить путь\к\папке на фактический путь, вам нужны кавычки, даже если путь не содержит пробелов, и замените .ext на фактическое расширение.

Это должно дать вам то, что вы хотите.

Вы можете использовать вашу dir /b /s команду в For /F цикле, чтобы сделать это, уже удаляя D:\ с помощью tokens^=2*delims^=\ и @echo= .\ + %~J

for /f tokens^=2*delims^=\ %i in ('dir/b/s D:\Folder\*.eXt')do @echo= .\%~j >>file.txt
  • Результаты:
.\File_01.eXt
.\File_02.eXt
.\Sub_Folder_1\File_03.eXt
.\Sub_Folder_1\File_04.eXt

Или, сохраните ваш \Folder... используя tokens^=1* и echo= .\ + %~j

for /f tokens^=1*delims^=\ %i in ('dir/b/s D:\Folder\*.eXt')do @echo= .\%~j >>file.txt
  • Результаты:
.\Folder\File_01.eXt
.\Folder\File_02.eXt
.\Folder\Sub_Folder_1\File_03.eXt
.\Folder\Sub_Folder_1\File_04.eXt
  • Вы также можете подавить/удалить .\ из команды @echo .\ при необходимости

  • Для PowerShell вы можете сделать то же самое:
ls *.eXt -re|% {$_.FullName.Split(":").Get(1)}|Out-File -FilePath .\Files_eXt.txt

Или, также добавив ".":

ls *.eXt -re|%{$_str="."+($_.FullName.Split(":").Get(1));$_str}>.\Files_eXt.txt

Ответ или решение

Для решения вашей задачи по получению списка всех файлов с определённым расширением в структуре каталогов в Windows с использованием относительных путей, вы можете воспользоваться несколькими подходами. Ниже представлены два наиболее эффективных способа: с использованием командной строки и PowerShell.

Способ 1: Использование командной строки (CMD)

Вы можете использовать цикл FOR в командной строке для получения относительных путей.

@echo off
setlocal enabledelayedexpansion

set "srcDir=D:\Путь\К\Папке"  REM Укажите путь к папке
cd /d "%srcDir%"  REM Переключаемся в директорию

(for /f "tokens=*" %%i in ('dir /b /s *.ext') do (
    set "file=%%i"
    set "file=!file:%srcDir%\=!"
    echo !file!
)) > list.filenames

Этот скрипт перебирает все файлы с заданным расширением, удаляет абсолютную часть пути и выводит только относительные пути в файл list.filenames.

Способ 2: Использование PowerShell

PowerShell предоставляет более удобные команды для работы с файлами и каталогами. Вот пример команды, которая выполнит аналогичную задачу:

$path="D:\Путь\К\Папке"  # Укажите путь к папке
Get-ChildItem -Path $path -Recurse -Filter "*.ext" | 
    ForEach-Object { $_.FullName.Replace($path, "") } | 
    Out-File -FilePath .\list.filenames

В этом примере мы используем команду Get-ChildItem для получения всех файлов с заданным расширением в указанной папке и подкаталогах. Затем мы заменяем полный путь на пустую строку, оставляя только относительные пути, и записываем результат в файл list.filenames.

Объяснение решений

  1. Командная строка (CMD):

    • Используется FOR /F, чтобы перебрать список файлов.
    • С помощью set и delayedexpansion мы удаляем часть пути до рабочей директории, чтобы получить относительный путь.
  2. PowerShell:

    • Get-ChildItem находит файлы с указанным расширением.
    • Replace удаляет абсолютный путь, оставляя только относительный.
    • Результат записывается в указанный файл.

Заключение

Оба предложенных варианта решения вопроса подходят для вашей задачи, выбор зависит от того, какую среду вы предпочитаете (CMD или PowerShell). PowerShell является более мощным и гибким инструментом, но если вам необходимо использовать только командную строку, то предложенный вариант на CMD будет очень эффективен.

Оцените материал
Добавить комментарий

Капча загружается...