Я пытаюсь создать текстовый файл, содержащий имя файла (включая полный путь) и размер файла для всех файлов в определенном каталоге и любых его подкаталогах (то есть рекурсивно). В идеале я не хочу запятых в размере файла (но я согласен на них!)
Следующая команда делает это, но без размера файла:
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
в одиночку, хотя я бы хотел оказаться неправым.
Есть ли другой способ сделать это, используя только команды, доступные из командной строки?
источник
"tokens=*"
следующее@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
txt
файл?for /r %a in (*) do echo %~fa %~za
>> C:\Temp\VideoList.txt
- Результаты любого процесса, предшествующего ранее, записываются в текстовый файл с именем VideoList , Используя один & GT; перезапишет файл ( если он уже существует ) и используя & GT; & GT; добавит новые результаты в конец, если текстовый файл ( если он уже существует ). Если текстовый файл еще не существует, эта команда записывает новый файл с указанным именем.@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
Альтернатива № 1: FOR / R является более интуитивным, чем № 2 для меня.
Альтернатива № 2: FOR / F исправляет проблему с «пробелами в именах» в предложении Брайана Адкинса.
Альтернатива № 3: FORFILES будет моим выбором, за исключением того, что путь в двойных кавычках.
У Брайана или других гуру может быть более изящное решение, или он может предложить дюжину других решений, но эти три работают. Я попытался использовать FOR TOKENS, но затем мне пришлось убрать верхние и нижние колонтитулы, поэтому я вернулся к # 1. Я также подумал о создании небольшого файла .bat и его вызове, но это добавляет еще один файл (хотя он обеспечивает большую гибкость, как и функция).
Я проверил все альтернативы с каталогом и именами файлов со встроенными пробелами, 200+ символьными именами файлов, именами файлов без расширений и на корне небольшого диска (только на время; немного медленный - как предложил Брайан - но потом выполняет поиск в проводнике Windows, поэтому я установил приложение «Все для поиска»).
Альтернатива № 1: FOR / R
Лучший(?) Пытаясь выяснить, почему решение Брайана не работает для меня, я посмотрел на HELP FOR и решил попробовать подход / R. (Создание файла будет таким же, как в Альтернативе № 2.)
Пример - Работы (другой каталог, чем выше, для демонстрации рекурсии)
Альтернатива № 2: FOR / F
Брайан Адкинс предложил:
@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
исправленный ответ является:
более полный ответ с подавленными каталогами и выводом (добавлением) в файл:
Примечание: «delims = *» указывает символ, не разрешенный в именах файлов.
Примечание: 2-я команда также подавляет каталоги с помощью / a: -d.
Примечание: Сделал заглавную букву имени переменной FOR, чтобы прояснить различие между переменной и параметрами переменной, если кто-то выбирает разные имена переменных.
Примечание: добавляется в файл только для ухмылок, так как ОП запрашивает вывод в файл.
Я полагаю, что мне действительно нужно проверить состояние ECHO и сбросить его.
Проблема - пробелы в именах
Предлагаемое Брайаном решение не обрабатывает имена файлов и папок, содержащие пробелы (по крайней мере, в моей конфигурации Vista).
Пример - Неверно (Без разделителей; Включает подавление каталога для OP, но с размером до и после имени файла для выделения)
Сокращенное имя и размер (неверно 4 из 6 файлов):
Пример - правильный (Обратите внимание на вывод на экран, не добавляется в файл)
Альтернатива № 3: ФАЙЛЫ (Цитата выпуск)
Это решение прямо из последних двух примеров в документации FORFILES (
forfiles /?
).Объединение этих примеров и запись в файл дает ответ (почти):
Обратите внимание, что путь указан в кавычках в выходных данных.
Неважно,
echo on
или жеecho off
переключаетсяДобавление пустой строки, разделяющей каждый каталог, было бы тривиальным расширением IF.
предосторожность : Использование маски
/m *.*
не будет возвращать файлы без расширения (как последний файл в примере)!В сторону : Это записывает файл в каждом каталоге с содержимым только этого каталога:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Не то, что хотел ОП, но иногда удобно.Пример - Работы (но с полным путем в кавычках)
Этот пример включает в себя дополнительный каталог с очень длинным именем файла и именем файла без расширения.
Проблема: путь в кавычках
Итак, есть ли простой способ удалить нежелательные (?) Кавычки в примере с OP и сохранить Альтернативу № 3: ФАЙЛЫ. (Риторический вопрос: цитаты - это особенность или недостаток?)
источник
Я понимаю, что это требует дополнительной утилиты , но вы можете добиться этого довольно кратко, используя утилита sfk :
(Я получил подход с помощью цепочка команд sfk здесь )
источник
Это может быть обманом по вопросу ОП. Однако этот вопрос больше не актуален в современных системах на базе Windows. Псевдоним Dir использовался, чтобы помочь нарисовать логическую связь.
источник
powershell "Get-ChildItem -Recurse| select name,length"
Ниже приведено то, что я использовал для поиска разных видеофайлов, занимающих слишком много места на сетевом диске, и записи результатов в текстовый файл на локальном ПК.
Я публикую свой поздний ответ по трем причинам. Во-первых, мне нравятся краткие ответы. Во-вторых, эта единственная строка сценария работала для меня в нескольких настройках, в том числе в сети. Три, согласно неясному комментарию Дона Винса под ответом Брайана Адкинса, с использованием токенов могут обойти проблемы с именами файлов с пробелами в них.
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 имеет очень хорошее представление об использовании реж команда, перечисляющая все переключатели, множество комбинаций переключателей и показывающая несколько полезных примеров правильного синтаксиса. Он не такой всеобъемлющий, как различные сообщества Stack Exchange, но в презентации есть определенная ясность, когда вы освоитесь с командной строкой / пакетным сценарием.
источник
Я достиг этого с помощью следующей команды:
Результат:
Постскриптум Это основано на ответе BillR (Альтернатива № 1). Однако в моем случае это зависает с
@echo off
,источник
Мне кажется, что команда du очень полезна, и она работает как в Windows, так и в Unix (она использовалась для проверки того, все ли файлы были скопированы при переносе большого количества данных с ПК с Windows на веб-сервер Linux):
выходы:
Тем не менее, я мог правильно видеть только специальные символы в Блокноте, а не в Блокноте ++ (должно быть, что-то вроде кодировки ANSI / UTF-8, сейчас нет времени на точный анализ). Также я не нашел решения для отображения размера после имени файла. Используйте параметры «b» или «k» вместо «h» для отображения размера в байтах или килобайтах. У меня возникли проблемы при запуске команды вне папки, которую я хочу проанализировать. Поэтому лучше всего ввести команду в правильном каталоге (в этом примере «C: \ your_dir») и указать ее в команде.
источник
Опустите b в dir / b / s / a: -D & gt; results.txt и результаты должны выглядеть следующим образом (т.е. dir / s / a: -D & gt; results.txt):
источник
Без чрезмерного усложнения это должно дать желаемый результат. Это даст немного больше, чем запрашивал ОП, но я подумал, что стоит упомянуть. Добавьте ключ / R, чтобы указать каталог, отличный от текущего.
источник
ERROR: Invalid syntax. Value expected for '/r'
так что подумайте о том, чтобы вернуться к чертежной доске и предоставить правильный синтаксис и редактировать Ваш ответ с правильной детализацией.where /?
говорит: «По умолчанию поиск выполняется по текущему каталогу и в путях, указанных переменной среды PATH ." - Так что вашиwhere * /t
Команда перечисляет каждый файл вC:\Windows\System32
некоторые подкаталогиC:\Program Files
и любой другой каталог вPATH
, Для меня это было более 3000 строк. Пожалуйста, рассмотрите возможность редактирования своего ответа, чтобы сделать его разумным. Постскриптум Без/R
это не рекурсивно.