Список файлів рекурсивно показує лише повний шлях та розмір файлу з командного рядка Windows


50

Я намагаюся створити текстовий файл, що містить ім'я файлу (включаючи повний шлях) та розмір файлу для всіх файлів у певному каталозі та будь-яких його підкаталогах (тобто рекурсивно). В ідеалі я не хочу коми в розмірі файлу (але я їх вирішую!)

Наступна команда робить це, але без розміру файлу:

dir /b /s /a:-D > results.txt

Приклад результату виглядає так:

C:\Users\Martin\Pictures\Table\original\PC120013.JPG  227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG  123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG  932344

Я не думаю, що це можливо, використовуючи dirпоодинці, хоча я хотів би, щоб це було неправильно. Чи є інший спосіб зробити це, використовуючи лише команди, доступні в командному рядку?

Відповіді:


28

Це слід зробити:

@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

Це не дуже ефективно ... запуск папок, що містять тону файлів, може бути схематичним, тому спершу спробуйте це у невеликих папках.

З "за /?" довідковий текст (я використав "а" замість "я")

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

The modifiers can be combined to get compound results:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

6
Я потрапив на маленький корч за допомогою цього: файли з пробілами в імені файлу не реєструвались неправильно. Щоб виправити це, я додав "tokens=*"наступне@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
Дон Вінс

Як роздрукувати його у txtфайл?
Саїд Неаматі

3
Має бутиfor /r %a in (*) do echo %~fa %~za
ЗАБ

1
@Saeed Neamati - Ось приклад >> C:\Temp\VideoList.txt. Результати будь-якого процесу, який раніше відбувся, записуються в текстовий файл під назвою VideoList . Використання одного > перезапише файл ( якщо він вже існує ), а за допомогою >> додасть нові результати до кінця, якщо текстовий файл ( якщо він вже існує ). Якщо текстовий файл ще не існує, ця команда записує новий файл із вказаним іменем.
user23715

це дало мені список * .dwg файлів, не розмір файлу, до текстового файлу:@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
CAD заблокував

14

Альтернатива №1: FOR / R для мене інтуїтивніше, ніж №2.
Альтернатива №2: FOR / F виправляє проблему з "пробілами в іменах" у пропозиції BrianAdkins.
Альтернатива №3: ​​FORFILES мій вибір, за винятком того, що шлях є в подвійних лапках.

Брайан або інші гуру можуть мати більш елегантне рішення або можуть запропонувати ще десяток інших рішень, але ці три роботи. Я спробував використовувати FOR TOKENS, але потім довелося знімати колонтитули, тому я повернувся до №1. Я також розглядав можливість створення невеликого .bat-файлу та виклику його, але це додає ще один файл (хоча він забезпечує більшу гнучкість, як і функція).

Я перевірив усі альтернативи з каталогом та назви файлів із вбудованими пробілами, ім'ям файлу 200+ символів, іменем файлу без розширення та на корені невеликого диска (просто на час; трохи повільно - як запропонував Брайан - але тоді так здійснює пошук у Провіднику Windows; саме тому я встановив додаток пошуку Everything).

Альтернатива №1: FOR / R

Найкраще (?) Коли я намагався з'ясувати, чому рішення Брайана не спрацювало для мене, я переглянув HELP FOR і вирішив спробувати підхід / R. (Створення файлу буде таким самим, як у Альтернативі №2.)

@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA

Приклад - працює (інший каталог, ніж вище для демонстрації рекурсії)

@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

Альтернатива №2: FOR / F

BrianAdkins 'запропонував: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

Виправлений відповідь є:

@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA 

Більш повний відповідь з каталогами пригнічений і вихід (додається) на файл:

@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt

Примітка: "delims = *" вказує символ, не дозволений у іменах.
Примітка: 2-а команда також пригнічує каталоги через / a: -d.
Примітка. Здійснено верхнє регістр імені змінної FOR для уточнення різниці між параметрами змінної та змінної, якщо хтось обирає різні імена змінних.
Примітка: Додано до файлу лише для посмішок, коли ОП попросило вивести файл.

Я припускаю, що мені слід справді перевірити стан ECHO та змінити його.

Випуск - Пробіли в іменах

Пропоноване Брайаном рішення не обробляє імена файлів і папок, що містять пробіли (принаймні, не в моїй конфігурації Vista).

Приклад - Неправильно (Без розмежувань; Включає придушувальний каталог на ОП, але з розміром до і після назви файлу для наголосу)

Урізане ім’я та розмір (4 з 6 файлів невірно):

@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
 C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
 C:\DeleteLater\Folder
 C:\DeleteLater\Folder
 C:\DeleteLater\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

Приклад - правильний (примітка виводиться на екран, не додається до файлу)

@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

Альтернатива № 3: ФОРМУЛИ (Випуск котирування )

Це рішення випливає з двох останніх прикладів документації FORFILES ( forfiles /?).

FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

Поєднання цих прикладів та запис у файл дає відповідь (майже):

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt

Зауважте, що шлях у лапках у висновку.
Не має значення , є чи echo onабо echo offпереключено.
Додавання порожнього рядка, що розділяє кожен каталог, було б тривіальним розширенням IF.

Застереження : Використання маски/m *.*не поверне файли без розширення (як, наприклад, останній файл)!

Убік : Це записує файл у кожен каталог із вмістом саме цього каталогу:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"Не те, що хотів ОП, але іноді зручно.

Приклад - Працює (але з повним шляхом в лапках)

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize"

"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0

Цей приклад включає додатковий каталог із надто довгим ім'ям файлу та ім'ям файлу без розширення.

Випуск: Шлях у котируваннях

Отже, чи є простий спосіб видалити небажані (?) Лапки за прикладом ОП та зберегти Альтернативу №3: ФОРФІЛИ. (Риторичне запитання: цитати є ознакою чи вадою?)


1

Я усвідомлюю, що це вимагає додаткової виразності , але ви можете досягти цього досить швидко, використовуючи утиліту sfk :

sfk cwd +run -yes "sfk list -size -tab $qfile +toclip"

sfk fromclip > C:\_temp\sfk_list_output.txt

(Я отримав підхід, використовуючи тут ланцюжок команд sfk )


1
powershell "dir | select name,length"

Це може бути обманом щодо питання про ОП. Однак питання вже не актуальне для сучасних систем на базі Windows. Псевдонім Діра був використаний, щоб допомогти провести логічний зв'язок.


2
Я спробував це (Windows 7). Пробіг зайняв понад 30 секунд (у каталозі з 20 записами), і він не спускався у підкаталоги.
Скотт

Для рекурсії перейдіть на: powershell "Get-ChildItem -Recurse| select name,length"
giorgiomugnaini

0

Нижче наведено те, що я використовував для пошуку різних відеофайлів, що займають занадто багато місця на мережевому диску, і записувати результати у текстовий файл на локальному ПК.

Я надсилаю свою дещо пізню відповідь з трьох причин. Один, мені подобаються стислі відповіді. По-друге, цей єдиний рядок сценарію працював у багатьох налаштуваннях для мене, в тому числі в мережі. По-третє, за потенційно незрозумілий коментар Дон Вінса під відповідь БрайанаАдкінса, використовуючи лексеми, можна обійти проблеми з імен файлів з пробілами в них.

for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt

Я помітив, що дуже довгі файлові шляхи / імена файлів (сотні символів) також можуть спричинити помилки, але пошук не зависне на них. Однак шлях залишається не повністю вивченим для ваших цілей. Зауваживши, ви можете це компенсувати, запустившись вглиб структури папки, щоб усунути цю помилку.

На цій сторінці ss64 є дуже хороша презентація використання команди dir , перелік всіх перемикачів, безліч комбінацій комутаторів та показ декількох корисних прикладів правильного синтаксису. Це не так всебічно, як різні спільноти обміну стеками, але є певна чіткість у презентації, як тільки вам зручно буде використовувати командний рядок / пакетний сценарій.


0

Я досягнув цього за допомогою наступної команди:

(for /R "\path\to\directory\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"

Результат:

D:\Users\Natasha>(for /R ".\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"


D:\Users\Natasha\Flowers_ (12).jpg 118886

D:\Users\Natasha\SomeFolder\data.txt 1241

D:\Users\Natasha\SomeFolder\CS\Counter-Strike_1.6.exe 272645624

PS Це засновано на відповіді BillR (Альтернатива №1). Однак у моєму випадку це звисає @echo off.


0

Я вважаю команду "du" досить корисною, і вона працює як в Windows, так і в Unix (використовувала її для перевірки того, чи всі файли були скопійовані при передачі багато даних з ПК з Windows на веб-сервер Linux):

du -ah "C:\your_dir" > "C:\file_list.txt"

Виходи:

15  C:\your_dir/.htaccess
608 C:\your_dir/folder/hello.txt
1.0 C:\your_dir/folder/subfolder/test.txt
1.0 C:\your_dir/folder/subfolder
1.2M    C:\your_dir/folder/world.txt
1.2M    C:\your_dir/folder
9.0 C:\your_dir/no_file_ending
11  C:\your_dir/sample document 1.txt
684K    C:\your_dir/sample document 2 - äöüßÄÖÜáà.txt
1.9M    C:\your_dir

Однак я міг лише правильно бачити спеціальні символи в «Блокноті», а не в «Блокноті ++» (має бути якась річ кодування ANSI / UTF-8, зараз немає часу точно аналізувати). Також я не знайшов рішення відобразити розмір після імені файлу. Використовуйте параметри "b" або "k" замість "h" для відображення розміру в байтах або кілобайтах. У мене виникли проблеми при запуску команди поза папкою, яку я хочу проаналізувати. Тож найкраще ввести команду в потрібний каталог ("C: \ your_dir" у цьому прикладі) та вказати її в команді.


-1

Пропустіть b у dir / b / s / a: -D> results.txt, і результати повинні виглядати так (тобто dir / s / a: -D> results.txt):

Гучність в накопичувачі H - FILES Серійний номер гучності - C9EB-112E

Каталог Н: \ Файли

29.09.2014 23:36 0 testing.txt 1 Файл (и) 0 байт

Каталог H: \ Video \ Action \ Comix

06.10.2012 09:51 184 740 file1.txt 20.07.2012 06:21 AM
864,832 file2.txt 31.08.2009 20:47 606,638 file3.txt 31.08.2009 21:07 160,320 файл4 .txt


Це НЕ відповідь на вихідний питання. Це не дає результату, про який він просив ОП.
DavidPostill

-1
where * /t  

Не надто складно, це повинно отримати бажаний вихід. Це дасть трохи більше, ніж просив ОП, але я вважав, що це варто згадати. Додайте перемикач / R, щоб вказати каталог, який не є поточним.


1
Розгляньте, як оновлення та підтвердження вашої відповіді працює, коли я намагався отримати повідомлення про помилку, ERROR: Invalid syntax. Value expected for '/r'тому подумайте про повернення до креслярської дошки та надання правильного синтаксису та відредагуйте свою відповідь правильною деталлю.
Pimp Juice IT

Подумайте про введення значення ... / R - це перемикач каталогів, за замовчуванням поточний каталог, якщо не залишити його.
someguy

"Це дасть трохи більше, ніж вимагає ОП". Ви жартуєте?  where /?каже: "За замовчуванням пошук проводиться по поточному каталогу та в шляхах, визначених змінною середовища PATH . "- так ваша where * /tкоманда перераховує кожен файл у C:\Windows\System32, деякі підкаталоги C:\Program Filesта всі інші каталоги в PATH. Для мене це було понад 3000 рядків. Будь ласка, подумайте про редагування своєї відповіді, щоб зробити її розумною. PS Без  /R, це не рекурсивно.
Скотт

ДЕ / Р. *. * працював на мене. / R. говорить шукати рекурсивно з вказаного місця (у цьому випадку його поточного каталогу). *. * - це шаблон, який повинен відповідати. Так WHERE / R% USERPROFILE% * .docx покаже всі файли слів у папці користувача. (Доводиться бігти * з \ у цих коментарях)
DHW
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.