Список файлов, рекурсивно показывающих только полный путь и размер файла из командной строки Windows
Я пытаюсь создать текстовый файл, содержащий имя файла (включая полный путь) и размер файла для всех файлов в определенном каталоге и любом из его подкаталогов (то есть рекурсивно). В идеале, я не хочу, чтобы запятые в размере файла (но я соглашусь на них!)
Следующая команда делает это, но без размера файла:
dir /b /s /a:-D > results.txt
Пример вывода будет выглядеть так:
- Как открыть командную строку в определенной папке в качестве администратора?
- Команда / сценарий для копирования файлов с определенным ext, который может иметь одно и то же имя, из структуры папок в singe directory и переименовывать
- Операции с несколькими файлами каталогов
- Точно вырезать видео файлы из командной строки
- «Net start service» и «sc start». В чем разница?
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
, хотя я хотел бы, чтобы меня оправдали. Есть ли другой способ сделать это, используя только команды, доступные из командной строки?
- Как преобразовать Word (doc) в PDF из командной строки Windows?
- Почему у нас есть логин, не-логин, интерактивные и неинтерактивные оболочки bash?
- Telnet не будет запускаться из приглашения cmd в Windows 7
- Фильтрация вывода верхней команды
- Linux-top / netstat / etc. На Mac OS X?
- В Windows 7 есть ли строка командной строки, которая может запускать cmd в качестве администратора?
- Где EXE для подсистемы для Unix-приложений, поэтому я могу использовать его?
- Как получить серийный номер жесткого диска из командной строки?
Это должно сделать это:
@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Это не очень эффективно … запуск его для папок, содержащих тонну файлов, может быть отрывочным, поэтому сначала попробуйте его в маленьких папках.
Из «для /?» Текст справки (я использовал «a» вместо «I»)
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
Альтернатива №1: FOR / R более интуитивно понятна, чем # 2 для меня.
Альтернатива №2: FOR / F фиксирует проблему с «пробелами в именах» в предложении Брайан Адкинса.
Альтернатива №3: FORFILES будет моим выбором, за исключением того, что путь находится в двойных кавычках.
Брайан или другие гуру могут иметь более элегантное решение или могут предложить еще десяток других решений, но эти три работы. Я пробовал использовать TO TOKENS, но затем мне пришлось снимать верхние и нижние колонтитулы, поэтому я вернулся на # 1. Я также решил создать небольшой файл .bat и вызвать его, но он добавляет другой файл (хотя он обеспечивает большую гибкость, как и функция).
Я протестировал все альтернативы с каталогом и именами файлов со встроенными пространствами, 200-значным именем файла, именем файла без расширения и корнем небольшого диска (только для времени, немного медленным – так же, как предложил Брайан), но затем так Ищет в Проводнике Windows, поэтому я установил все приложение для поиска).
Альтернатива № 1: FOR / R
Лучшее (?) При попытке выяснить, почему решение Брайана не сработало для меня, я посмотрел HELP FOR и решил попробовать / R подход. (Создание файла будет таким же, как в Alternative # 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
Брайан Адкинс предложил: @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 = *» указывает символ, который не разрешен в именах файлов.
Примечание. Вторая команда также подавляет каталоги через / a: -d.
Примечание. Сделано заглавное имя переменной переменной FOR, чтобы прояснить различие между переменными и переменными параметрами, если кто-то выбирает разные имена переменных.
Примечание: добавлено в файл только для усмешек, поскольку OP запросил вывод в файл.
Полагаю, мне действительно нужно проверить статус ECHO и сбросить его.
Проблема – пространства в именах
Предлагаемое решение Брайана не обрабатывает имена файлов и папок, содержащие пробелы (по крайней мере, не в моей конфигурации Vista).
Пример – Неправильно (Без разделителей; Включает подавление каталога на OP, но с размером как до, так и после имени файла для выделения)
Усеченное имя и размер (неверно 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 (Quote Issue)
Это решение прямо из двух последних примеров в документации 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"
Не то, что OP хотел, а иногда и удобно.
Пример – работает (но с полным путем в кавычках)
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
Этот пример включает дополнительный каталог с супер длинным именем файла и именем файла без расширения.
Проблема: путь в цитатах
Итак, есть ли простой способ удалить ненужные (?) Кавычки на пример OP и сохранить альтернативу №3: FORFILES. (Риторический вопрос: являются ли кавычки признаком или недостатком?)
Я понимаю, что это требует дополнительной утилиты , но вы можете добиться этого достаточно лаконично с помощью утилиты sfk :
sfk cwd +run -yes "sfk list -size -tab $qfile +toclip" sfk fromclip > C:\_temp\sfk_list_output.txt
(Я получил подход, используя цепочку команд sfk здесь )
Ниже я нашел локальные видеофайлы, которые занимали слишком много места на сетевом диске и записывали результаты в текстовый файл на локальном ПК.
Я отправляю свой собственный несколько поздний ответ по трем причинам. Во-первых, мне нравятся краткие ответы. Во-вторых, эта единственная строка сценария работала в нескольких настройках для меня, в том числе по сети. Три из потенциально скрытого комментария Дон Винса в ответ Брайан Адкинса, используя токены, могут обойти проблемы из имен файлов с пробелами в них.
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 , перечисление всех переключателей, множество комбинаций коммутаторов и отображение нескольких полезных примеров правильного синтаксиса. Это не так полно, как различные сообщества Stack Exchange, но есть определенная ясность в презентации, как только вам станет удобно с командной строкой / пакетным скриптом.
Я достиг этого с помощью следующей команды:
(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 Это основано на ответе БиллР (Альтернатива №1). Однако в моем случае он зависает с @echo off
.
Опустите b в каталоге dir / b / s / a: -D> results.txt, и результаты должны выглядеть так (например, dir / s / a: -D> results.txt):
Объем в приводе H – FILES Объем Серийный номер – C9EB-112E
Каталог H: \ Files
09/29/2014 11:36 PM 0 testing.txt 1 Файл (ы) 0 байт
Каталог H: \ Video \ Action \ Comix
10/06/2012 09:51 AM 184,740 file1.txt 07/20/2012 06:21 AM
864,832 file2.txt 31.08.2009 20:47 606,638 file3.txt 31.08.2009 21:07 160,320 file4.txt