仅使用 Windows 命令行列出子目录中的文件并获取相对路径

仅使用 Windows 命令行列出子目录中的文件并获取相对路径

我想使用 Windows 命令行列出带有路径的文件。

例如:

~\folder1
  \1.jpg
  \2.jpg
~\folder2
  \01.jpg
  \02.jpg

我希望输出类似于相对路径而不是完整路径:

.\folder1\1.jpg
.\foler1\2.jpg

当我使用DIR /S /B *.jpg > list.txt列出完整路径时C:\download\folder\folder1\1.jpg,我只需要列出相对路径,例如.\folder1\1.jpg......

使用 Linux 命令行find ./ -iname *.jpg > list.txt,可以给我预期的结果,但我需要一个可以在 Windows 上像这样工作的解决方案。

答案1

使用 Windows 命令行列出带有子目录的文件

我想要输出:\folder1\1.jpg,.\foler1\2.jpg....

我知道如果我们使用 dir /s/b *.jpg > list.txt 将会得到类似 C:\download\folder\folder1\1.jpg 的内容,我不想那样,我只需要 .\folder1\1.jpg

变量澄清(下)

  • 下面的逻辑在哪里FOR %X IN ("folder1","Folder2"),或者SET Folders=("Folder1","Folder2","Folder3","Folder4")你将把你的 "Folder1",,"Folder2"等等就像那样,用双引号和逗号表示你想要查找的每个文件夹名称,然后列出./Foldername/file.jpg你要附加回显输出的文件。
  • 为了命令行复制示例,您将需要CD /D C:\Path对文件所在的子文件夹的父目录执行操作.JPG,因为该逻辑是隐式的,假设您在父目录中找到这些子文件夹以及它们包含的文件类型/扩展名。
  • 对于其他示例,您只需插入包含值.JPG中存在文件的所有子文件夹的父目录SET ParentDir=,一切都应按预期工作。
  • 我认为其他变量应该SET是不言自明的,因为它们的名称与它们的含义非常接近,但如果您需要进一步说明,请告诉我。

命令行复制示例

FOR %X IN ("folder1","Folder2") DO FOR /F "TOKENS=*" %F IN ('DIR /B /A-D ".\%~X\*.jpg"') DO ECHO .\%~X\%~F>>C:\Path\Log.txt

设置变量命令行复制示例

(使用以下命令设置文件夹名称和文件扩展名DIR。还插入要以该格式附加到文本文件的子文件夹所在的父目录完整路径。)

SET FileType=*.jpg
SET ParentDir=C:\Users\Name\Desktop
SET Folders=("Folder1","Folder2","Folder3","Folder4")
SET LogFile=C:\Path\LogFile.txt

CD /D "%ParentDir%"
FOR %X IN %Folders% DO FOR /F "TOKENS=*" %F IN ('DIR /B /A-D ".\%~X\%FileType%"') DO ECHO .\%~X\%~F>>"%LogFile%"

带设置变量的批处理脚本示例

@ECHO ON
SET FileType=*.jpg
SET ParentDir=C:\Users\Name\Desktop
SET Folders=("Folder1","Folder2","Folder3","Folder4")
SET LogFile=C:\Path\LogFile.txt

CD /D "%ParentDir%"
FOR %%X IN %Folders% DO FOR /F "TOKENS=*" %%F IN (

    'DIR /B /A-D ".\%%~X\%FileType%"'

) DO ECHO .\%%~X\%%~F>>"%LogFile%"
GOTO EOF

进一步阅读和资源

答案2

对于 POWERSHELL - 一行程序

您还可以使用 PowerShell:

PS> Get-ChildItem -Recurse . | Resolve-Path -Relative

或者从 cmd 提示符或批处理文件中:

powershell.exe "Get-ChildItem -Recurse . | Resolve-Path -Relative"

答案3

我也在寻找仅列出相对路径的函数。

这里有一些替代解决方案...

(请将 %cd% 替换为您的开始路径,例如 C:\download\folder )

列出所有具有相对于特定起始路径的路径的子目录和文件:

@echo off
SET "StartPath=%cd%"

SetLocal EnableDelayedExpansion
FOR /f "tokens=*" %%f in ('dir /B /ON /S "!StartPath!"') DO (
    set "SubDirsAndFiles=%%f"
    set "SubDirsAndFiles=!SubDirsAndFiles:%StartPath%=!"
    ECHO !SubDirsAndFiles! 
)

仅列出相对于特定起始路径的相对路径的选定文件类型(例如 *.jpg、*.png):

@echo off
SET "StartPath=%cd%"

SetLocal EnableDelayedExpansion
FOR /f "tokens=*" %%f in ('dir /B /ON /S "!StartPath!\*.jpg" "!StartPath!\*.png"') DO (
    set "SubDirsAndFiles=%%f"
    set "SubDirsAndFiles=!SubDirsAndFiles:%StartPath%=!"
    ECHO !SubDirsAndFiles! 
)

列出所有具有相对于特定起始路径的相对路径的子目录和文件(路径以 \ 结尾):

@echo off
SET "StartPath=%cd%"

SetLocal EnableDelayedExpansion
FOR /f "tokens=*" %%f in ('dir /B /ON /S "!StartPath!"') DO (
    set "SubDirsAndFiles=%%f"
    set "SubDirsAndFiles=!SubDirsAndFiles:%StartPath%=!"
    IF EXIST "!StartPath!\!SubDirsAndFiles!\" (
        REM Echo This is a folder...
        ECHO !SubDirsAndFiles!\
    ) ELSE (
        REM Echo This is a file...
        ECHO !SubDirsAndFiles!
    )
)

答案4

一行 BATCH 命令:

for /r %x in (*) do set _curFilePath=%~x& call echo .\%_curFilePath:%CD%\=%

在批处理文件(.bat 或 .cmd)中:

for /r %%x in (*) do set _curFilePath=%%~x& call echo .\%%_curFilePath:%CD%\=%%

“call” 用于临时模拟动态分配。将“echo”更改为您想要的命令。

相关内容