Вопрос или проблема
Я хотел бы перечислить все имена файлов всех файлов с определённым расширением в структуре каталогов и записать это в файл. Вот что я достиг:
dir /B /S *.ext > list.filenames
Это дает мне список всех файлов, которые я хочу видеть в списке. Но он перечисляет файлы с абсолютным путем, включая букву диска и полный путь. Мне нужен относительный путь без буквы диска и пути к рабочему каталогу.
Я думал о двух возможностях, но не нашёл решения:
- Сказать dir выводить только относительные пути
- Удалить ненужную часть пути из созданного файла.
Обе задачи мне не удалось выполнить. Есть идеи?
Вот решение, которое вызывает 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
-
Некоторые дополнительные материалы cmd:
-
Некоторые дополнительные материалы powershell
Ответ или решение
Для решения вашей задачи по получению списка всех файлов с определённым расширением в структуре каталогов в 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
.
Объяснение решений
-
Командная строка (CMD):
- Используется
FOR /F
, чтобы перебрать список файлов. - С помощью
set
иdelayedexpansion
мы удаляем часть пути до рабочей директории, чтобы получить относительный путь.
- Используется
-
PowerShell:
Get-ChildItem
находит файлы с указанным расширением.Replace
удаляет абсолютный путь, оставляя только относительный.- Результат записывается в указанный файл.
Заключение
Оба предложенных варианта решения вопроса подходят для вашей задачи, выбор зависит от того, какую среду вы предпочитаете (CMD или PowerShell). PowerShell является более мощным и гибким инструментом, но если вам необходимо использовать только командную строку, то предложенный вариант на CMD будет очень эффективен.