Как напечатать файлы с именем текущего каталога вместо полного пути
dir /b /s
Это печатает:D:\stuff\tmp>dir /b /s
D:\stuff\tmp\A.java
D:\stuff\tmp\AAA
D:\stuff\tmp\B.java
D:\stuff\tmp\C.java
D:\stuff\tmp\Why.class
D:\stuff\tmp\Why.java
D:\stuff\tmp\XX.class
D:\stuff\tmp\XX.java
D:\stuff\tmp\XX.txt
D:\stuff\tmp\AAA\aaa.kkk
Мне нужно напечатать:D:\stuff\tmp>????
tmp\A.java
tmp\AAA
tmp\B.java
tmp\C.java
tmp\Why.class
tmp\Why.java
tmp\XX.class
tmp\XX.java
tmp\XX.txt
tmp\AAA\aaa.kkk
Как я могу это сделать?
1 ответ
Это работает для меня, если вы поместите в файл CMD следующее:
@echo off
SETLOCAL EnableDelayedExpansion
for /f "usebackq delims=" %%A in (`cmd /c dir /s /b`) DO (
set NAME=%%A
set SHORT=!NAME:%cd%\=!
echo.!SHORT!
)
Требуется вывод вашего оригинала dir
команда и использует подстановку строк для удаления текущего каталога. Увидеть set /?
для получения дополнительной информации об этом. Если вы предпочитаете передавать каталог в качестве аргумента вместо использования текущего каталога, попробуйте эту модификацию переменных:
@echo off
SETLOCAL EnableDelayedExpansion
for /f "usebackq delims=" %%A in (`cmd /c dir /s /b %1`) DO (
set NAME=%%A
set SHORT=!NAME:%~1\=!
echo.!SHORT!
)
Остерегайтесь имен файлов и каталогов, которые имеют восклицательный знак в имени файла, так как они, как правило, удаляются этим методом. Если вам нужно что-то более надежное, способное справиться с этим, изучите установку GNU sed или grep. Вы также можете исследовать команду GNU find, если не возражаете против имен файлов, возвращающихся в стиле UNIX с косой чертой вместо обратной косой черты и лидирующей ./
перед каждой записью.
Есть также другой ответ, который может дать вам идеи по обработке восклицательных знаков при обработке CMD: https://stackoverflow.com/questions/32873578/how-to-read-a-string-with-from-a-file-in-windows-batch-script/32874195