Как из папки вытащить все файлы

от admin

Как скопировать сразу все файлы из множества подпапок

Всем доброго времени суток и всяческих прочих разностей.

Небольшая заметка в блог, которая может немного упростить кому-либо жизнь в определенной ситуации, а точнее говоря спасти бесценное времени. Речь идет о ситуации, когда у Вас есть огромное количество подпапок в каждой из которых лежат файлы и все их надо скопировать в одну.

Как Вы понимаете, мышкой открывать каждую папку, чтобы потом тыркнуть скопировать (ну или перетащить), чтобы потом тыркнуть вставить в нужную, и так по кругу, достаточно, мягко говоря, накладно (особенно, если разных подпапок, скажем тысяча и более). А уж если в папках есть подпапки, а в них еще.. Ну Вы поняли.

Рассказываю как сделать это быстро и просто.

Чтобы Вы поняли о чем идет речь, есть вот такая вот каша из более чем тысячи папок в которых, собственно, тысячи файлов:

множество папок с множеством файлов

Нужно получить на выходе такую вот кашу из всех файлов, но в одной папке:

sdfs dsfd fsd

Можно сделать это консолью, но можно и поступить попроще. Скачиваем Total Commander , запускаем, открываем папку в которой лежат подпапки с папками, т.е верхнюю в структуре:

fds fds sdfsdf

Нажимаем на клавиатуре Ctrl+B , чтобы отобразить все файлы во всех папках и подпапках, одним списком, т.е без папок, т.е содержимое:

sdf sdfsfd sdf

Используя, скажем, мышь или клавишу F5 (копирование) или клавишу F6 (перемещение) копируем в нужную нам папку.

На сим, собственно, всё, такая вот кратенькая заметка.
Авось кому-нибудь пригодится 😉

Белов Андрей (Sonikelf) alt=»Sonikelf» /> alt=»Sonikelf» />Заметки Сис.Админа [Sonikelf’s Project’s] Космодамианская наб., 32-34 Россия, Москва (916) 174-8226

Как быстро достать все файлы из кучи папок?

Есть куча папок. В них ещё куча папок. В них файлы, c ещё кучей папок. Одним словом — срач. Как мне все файлы из всех этих папок достать, и переместить в одну? Я сперва подумал, что надо просто в поиск вбить точку (ну типа у каждого же файла есть расширение, соответственно и точка в названии), и всё переместить, но оказалось, что так не все файлы нашлись. То есть, видимо, в этой помойке есть и файлы вообще без расширений, и они мне тоже нужны. В общем, кто знает метод — помогите пожалуйста)

Total Commander → Ctrl+B (показать файлы без каталогов) → Ctrl+A (выделить всё) → Ctrl+X (вырезать) → Ctrl+V (вставить)

Вот это, только советую не вырезать, а скопировать. А то мало ли что. И при копировании не забыть нажать options > overwrite options > 5. auto rename copied.
Но я бы сильно не советовал делать это ибо будет бардак.

Еще не мешает надеть перчаточки, масочку и сделать резервные копии всех жестких дисков, обзвонить родственников на случай сердечного приступа.

Мы не знаем что у него за файлы и зачем ему это понадобилось. Если у него есть нужные файлы без расширения, вполне возможно что у него и накопитель поломан.

сделать резервные копии всех жестких дисков,

Верно, нужно иметь резервные копии всех важных данных

обзвонить родственников на случай сердечного приступа.

Тоже верно, ряд родственники должны знать что делать в случае сердечного приступа. Например покормить твоего кота.

Как раз хотел написать.

так ты получаешь все файлы и папки.
проблема в том, что в этом сраче могут быть дубликаты по названию и просто сделать

Эти красные глаза я узнаю из тысячи

Почему >? Это же перенаправление потока, которое тупо в консоль или из консоли. Раньше нужно было | использовать.
И вообще работать не будет. Минимум надо %1 в move и оформить батником.
Плюс в конце дир тебе выдаст сводку общему объему, там был еще параметр чтобы чистый список выдавал файла.
EDIT: Во, dir /s /b дает нормальный список файлов с полными путями.

Ещё исключить папки и передать вывод в xargs. то есть, for:
for /F "delims==" %%F in (‘dir ".\in\" /A-D /B /S’) do xcopy "%%F" ".\out\"
Или лучше без dir:
for /R ".\in\" %%F in (*) do xcopy "%%F" ".\out\"
Но это лишь разминка для ума (получается неудобно и ещё нужна обработка дубликатов).

он же написал, что есть файлы и без расширений, поэтому *.* не подойдет

а вообще погугли за *.bat файлы — у тебя именно тот момент, когда тебе пригодится работа в консоли, хе-хе.

Именно тот момент, когда не пригодится =\ Ты предложил пока самое сложное решение и написал, что оно не работает.

copy и move молча переписывают дубликаты, xcopy и robocopy не дают их переименовать, xxсopy умеет всё необходимое (переименование, слияние подпапок, проверка, логирование), но его нужно скачивать, xxxcopy (.com) давно закрылся.

В консоль стоило бы лезть только для экзотических случаев — допустим, исходную папку слишком опасно трогать и поэтому делаем хардлинки вместо перемещения или заменяем исходный файл симлинком или бэкапим иерархию или.

Как получить список файлов в папке (например, название музыки и фильмов перенести в текст и всё упорядочить. )

spisok-faylov

Вопрос от пользователя

Здравствуйте.

Помогите с одним вопросом. У меня есть несколько внешних дисков и на них записаны фильмы. Я хочу получить список всех названий (имен) этих файлов в тексте, чтобы его распечатать и положить рядом в коробочку с диском (скажем, навести порядок!).

Это серьезно бы облегчило поиск и подключение нужного диска.

Эту задачу можно решить несколькими способами (несмотря на то, что я ниже приведу универсальные варианты — в зависимости от вашей версии Windows, часть из них может не сработать. ). Так что проверяйте сразу несколько из них. 👌

ускорение ПК

Способы получить список имен файлов

Вариант 1 (с помощью Total Commander)

Наиболее простой и предпочтительный вариант (к тому же точно работающий во всех версиях ОС) — воспользоваться помощью 👉 Total Commander (ссылка на офиц. сайт). Если кто не знает — это спец. программа для работы с файлами (альтернатива проводнику).

Запустив Total Commander, перейдите в нужный каталог (в тот, где у вас хранятся фильмы, например) и выделите все файлы (для этого достаточно нажать Ctrl+A).

Выделяем все файлы в нужном каталоге

Выделяем все файлы в нужном каталоге

Далее в меню «Выделение» выберите опцию «Сохранить выделение в файл. « (в некоторых версиях программы есть возможность скопировать имена файлов в буфер — если сделаете так, то потом откройте документ Word и вставьте список, нажав Ctrl+V ).

Сохранить выделение в файл (Total Commander)

Сохранить выделение в файл (Total Commander)

Собственно, полученный текстовый файл можно открыть в любом блокноте (я использую Notepad++), ну и после распечатать список (Ctrl+P) . 👌

Текстовый файл можно открывать - список готов!

Текстовый файл можно открывать — список готов!

Вариант 2 (через браузер)

Для этого нам понадобиться запустить какой-нибудь современный 👉 браузер (я проверял на Chrome и Firefox).

После откройте проводник и перейдите в папку с нужными вам файлами — нужно будет скопировать путь до нее, нажать сочетание Ctrl+C (адрес, вида: «C:\Users\alex\Videos\Фильмы» )

Открываем каталог

После, вставить этот скопированный «путь» в адресную строку браузера и нажать Enter. В результате вы увидите, что обозреватель покажет вам список всех файлов и дату последнего изменения.

Теперь достаточно выделить всё нужное на странице и скопировать это (👇).

Открываем путь в Chrome

Открываем путь в Chrome

Затем скопированный список лучше всего вставить (сочетание Ctrl+V) в Excel (или 👉 его аналоги). Это удобнее тем, что в Excel вы легко сможете удалить ненужные вам столбики (с датой, например) .

Вставляем список в Excel для дальнейшей работы.

Вставляем список в Excel для дальнейшей работы.

Вариант 3 (список со вложенными файлами и папками)

Этот способ универсальный, и к тому же позволяет получить не только список файлов из текущего каталога, но и из всех вложенных.

Например, есть у вас в каталоге «Видео» отдельная папка «Кино 90-х» , в которой 2 десятка др. фильмов — вышеперечисленные способы бы не позволили узнать их название (из полученного списка), а этот позволит!

Для работы нам понадобиться 👉 командная строка (ничего сложного там не будет!) .

В ней нужно последовательно ввести две команды, после каждой нажать Enter:

  1. cd C:\Users\alex\Videos\Фильмы (вместо «C:\Users\alex\Videos\Фильмы» укажите свой каталог) ;
  2. dir /b /s | sort > List.txt (эта команда создаст файл «List.txt» в выбранной вами папке со всеми файлами и каталогами, что в нем есть! Кроме этого, она отсортирует список от А к Я).

CMD - открываем каталог, получаем список

CMD — открываем каталог, получаем список

Файл-список готов!

Как убрать путь (C:\Video\) из списка

Кстати, если в списке файлов вам среди названия фильмов (файлов) не нужен их путь — то его легко убрать. Для этого в Notepad++ достаточно:

  • нажать на Ctrl+F ;
  • в окне «Замена» в строку «найти» указать путь (который повторяется в каждой строке);
  • в строке «Заменить на» проверить, чтобы была пустота;
  • и нажать кнопку «заменить все» . В результате: в вашем списке будут только имена (без пути)!

Убираем путь до каталога в блокноте

Убираем путь до каталога в блокноте

Вариант 4 (без доп. софта)

Этот способ работает не во всех версиях ОС Windows (в 10-ке все OK). Зато он быстрый и не требует вообще никакого доп. софта.

  1. зайти в нужный каталог;
  2. выделить файлы (Ctrl+A);
  3. зажать клавишу Shift (левую);
  4. нажать ПКМ (правую кнопку мыши), не отпуская Shift;
  5. из появившегося меню проводника выбрать опцию «Копировать как путь» . Теперь в буфере обмена есть все имена файлов из каталога!
Читать:
Как разложить функцию в ряд лорана

Выделяем и копируем путь

Выделяем и копируем путь

Теперь можно открыть блокнот или тот же Word и вставить список (Ctrl+V).

Вставляем скопированный список

Вставляем скопированный список

Если вам мешает в каждой строке путь («C:\Users\») — то как его убрать см. чуть выше.

Как скопировать сразу все файлы из множества подпапок?

‘ Параметры вызова из TC:
‘ %L «%T» [<режим копирования>]
‘ где необязательный параметр <режим копирования>может принимать значения:
‘ 0 — если в файле-списке указана папка, а не файл, то вложенные файлы и папки
‘ копируются с сохранением относительной структуры (по умолчанию);
‘ 1 — копирование всех файлов в корень целевой папки;
‘ 2 — копирование с созданием полной стуктуры вложенных папок относительно
‘ корня диска
‘ Если 1-ый параметр указан пустым («»), то файл-список выбирается вручную
‘ Если 2-ой параметр указан пустым («»), то целевая папка выбирается вручную
‘==============================================================================
Option Explicit
‘===== Изменяемые параметры ===================================================
Const Overwrite = False ‘Признак перезаписи существующих файлов
Const IgnorePrefix = «file://localhost/» ‘Игнорируемый префикс
‘==============================================================================
Dim FSO, FileList, TargetDir, Mess, Mess1, List, F, Errors, MessMode
Dim FilesAmount, FoldersAmount, CopyMode, Depth, i, oSA, CopyFlags, WSH

SetMess
Set oSA = CreateObject(«Shell.Application»)
Set WSH = CreateObject(«WScript.Shell»)
CheckParam
List = Split(FSO.OpenTextFile(FileList, 1).ReadAll, vbNewLine)
If Overwrite Then
CopyFlags = 16
Else
CopyFlags = 0
End If

Set Errors = CreateObject(«Scripting.Dictionary»)
If CopyMode = 2 Then
Set Depth = CreateObject(«Scripting.Dictionary»)
End If
FilesAmount = 0
FoldersAmount = 0
For Each F In List
F = Trim(F)
If F <> «» Then
If LCase(Left(F, Len(IgnorePrefix))) = LCase(IgnorePrefix) Then
F = Mid(F, Len(IgnorePrefix) + 1)
End If
F = GetPath(F)
On Error Resume Next
Copy F, TargetDir
On Error GoTo 0
End If
Next
If FilesAmount > 0 Then
Mess1 = Mess(6) & » » & FilesAmount & » » & Mess(7)
End If
If FoldersAmount > 0 Then
Mess1 = Mess1 & vbNewLine & Mess(6) & » » & FoldersAmount & » » & Mess(13)
End If
If (FilesAmount = 0) And (FoldersAmount = 0) Then
Mess1 = Mess(8)
End If
If Errors.Count > 0 Then
MessMode = 2
Else
MessMode = 3
End If
Mess1 = Mess1 & vbNewLine & JoinErr(Errors)
MessBox Mess1, MessMode

Sub CheckParam
If WScript.Arguments.Count = 0 Then
MessBox Mess(1), 1
Quit
End If
If WScript.Arguments.Count < 2 Then
MessBox Mess(2), 1
Quit
End If
FileList = WScript.Arguments(0)
TargetDir = WScript.Arguments(1)
Set FSO = CreateObject(«Scripting.FileSystemObject»)
If FileList = «» Then
FileList = OpenFile
Else
FileList = GetPath(FileList)
End If
If TargetDir = «» Then
TargetDir = OpenFolder
Else
TargetDir = GetPath(TargetDir)
End If
If Not FSO.FileExists(FileList) Then
MessBox Mess(3), 1
Quit
End If
If Not FSO.FolderExists(TargetDir) Then
MessBox Mess(4), 1
Quit
End If
If FSO.GetFile(FileList).Size = 0 Then
MessBox Mess(5), 1
Quit
End If
If WScript.Arguments.Count > 2 Then
CopyMode = WScript.Arguments(2)
If Not (CopyMode = 0 Or CopyMode = 1 Or CopyMode = 2) Then
MessBox Mess(11), 1
Quit
End If
Else
CopyMode = 0
End If
End Sub

Sub SetMess
Set Mess = CreateObject(«Scripting.Dictionary»)
Mess.Add 0, «Копирование из файла-списка»
Mess.Add 1, «Не указаны входные параметры!»
Mess.Add 2, «Указаны не все входные параметры!»
Mess.Add 3, «Файл-список не существует!»
Mess.Add 4, «Целевая папка не существует!»
Mess.Add 5, «Файл-список пустой!»
Mess.Add 6, «Успешно скопировано»
Mess.Add 7, «файлов.»
Mess.Add 8, «Ничего не удалось скопировать.»
Mess.Add 9, «Не удалось выполнить копирование»
Mess.Add 10, «по причине ошибки:»
Mess.Add 11, «Неправильно указан режим копирования!»
Mess.Add 12, «Успешно создано»
Mess.Add 13, «папок.»
Mess.Add 14, «В целевой папке данный файл уже существует!»
Mess.Add 15, «Выбирете целевую папку»
Mess.Add 16, «Файл-список»
Mess.Add 17, «Ошибка не известна.»
Mess.Add 18, «Введите путь к файлу-списку.»
Mess.Add 19, «Введено несуществующее имя файла.» & vbNewLine & «Нажмите «»OK»» для повторного ввода.»
End Sub

Function MessBox(pMess, pMode)
Dim lIcon
Select Case pMode
Case 1 lIcon = vbCritical + vbOKOnly
Case 2 lIcon = vbExclamation + vbOKOnly
Case 3 lIcon = vbInformation + vbOKOnly
Case 4 lIcon = vbExclamation + vbOKCancel
End Select
MessBox = MsgBox(pMess, lIcon, Mess(0))
End Function

Function JoinErr(pDic)
Dim lKey
For Each lKey In pDic
JoinErr = JoinErr & vbNewLine & vbNewLine & _
Mess(9) & » «»» & lKey & «»» » & Mess(10) & _
vbNewLine & pDic(lKey)
Next
End Function

Sub Copy(pF, pTarget)
Dim lF, oF, lTarget, oNS
lTarget = pTarget
If Right(lTarget, 1) <> «\» Then
lTarget = lTarget & «\»
End If
If CopyMode = 2 Then
lTarget = CopyFolderStructure(lTarget, pF)
End If
If FSO.FileExists(pF) Then
If (Not Overwrite) And FSO.FileExists(lTarget & FSO.GetFile(pF).Name) Then
Errors.Add pF, Mess(14)
Else
CreateFoldersTree lTarget
Set oNS = oSA.NameSpace(lTarget)
oNS.CopyHere pF, CopyFlags
Set oNS = Nothing
If Err.Number <> 0 Then
Errors.Add pF, Err.Description
Else
If Not FSO.FileExists(lTarget & FSO.GetFile(pF).Name) Then
Errors.Add pF, Mess(17)
Else
FilesAmount = FilesAmount + 1
End If
End If
End If
End If
If FSO.FolderExists(pF) Then
CreateFoldersTree lTarget
Set oF = FSO.GetFolder(pF)
If (CopyMode = 0) Or (CopyMode = 2) Then
Set oNS = oSA.NameSpace(lTarget)
oNS.CopyHere pF, CopyFlags
Set oNS = Nothing
If Err.Number <> 0 Then
Errors.Add pF, Err.Description
Else
If Not FSO.FolderExists(lTarget & oF.Name) Then
Errors.Add pF, Mess(17)
Else
FoldersAmount = FoldersAmount + 1
End If
End If
End If
If CopyMode = 1 Then
For Each lF In oF.Files
If (Not Overwrite) And FSO.FileExists(lTarget & lF.Name) Then
Errors.Add lF.Path, Mess(14)
Else
Set oNS = oSA.NameSpace(lTarget)
oNS.CopyHere lF.Path, CopyFlags
Set oNS = Nothing
If Err.Number <> 0 Then
Errors.Add lF.Path, Err.Description
Else
If Not FSO.FileExists(lTarget & lF.Name) Then
Errors.Add lF.Path, Mess(17)
Else
FilesAmount = FilesAmount + 1
End If
End If
End If
Next
For Each lF In oF.SubFolders
Copy lF.Path, lTarget
Next
Set lF = Nothing
End If
Set oF = Nothing
End If
End Sub

Function CopyFolderStructure(pTarget, pPath)
Dim lPath
If FSO.FileExists(pPath) Then
lPath = FSO.GetParentFolderName(pPath) & «\»
Else
lPath = FSO.GetAbsolutePathName(pPath) & «\»
End If
Depth.RemoveAll
GetDepth lPath
CopyFolderStructure = pTarget
For i = Depth.Count To 1 Step -1
CopyFolderStructure = CopyFolderStructure & Depth(i) & «\»
Next
End Function

Sub CreateFoldersTree(pFolder)
Dim lParentFolder
If Not FSO.FolderExists(pFolder) Then
lParentFolder = FSO.GetParentFolderName(pFolder)
If Not FSO.FolderExists(lParentFolder) Then
CreateFoldersTree(lParentFolder)
End If
FSO.CreateFolder(pFolder)
End If
End Sub

Sub GetDepth(pPath)
Depth.Add Depth.Count + 1, FSO.GetFolder(pPath).Name
If FSO.GetDriveName(pPath) & «\» <> FSO.GetParentFolderName(pPath) Then
GetDepth FSO.GetParentFolderName(pPath)
End If
End Sub

Function OpenFile
Dim Dlg, DlgResult
On Error Resume Next
Set Dlg = CreateObject(«UserAccounts.CommonDialog»)
If Err.Number = 0 Then
On Error GoTo 0
Dlg.Filter = Mess(16) & » (*.*)|*.*»
Dlg.Flags = &H4 + &H8 + &H400 + &H1000 + &H80000
DlgResult = Dlg.ShowOpen
If DlgResult Then
OpenFile = Dlg.FileName
End If
Set Dlg = Nothing
If Not DlgResult Then
Quit
End If
Else
On Error GoTo 0
Do
Dlg = InputBox(Mess(18), Mess(0))
If Dlg = «» Then
Quit
Else
Dlg = GetPath(Dlg)
End If
If Not FSO.FileExists(Dlg) Then
Dlg = «»
DlgResult = MessBox(Mess(19), 4)
If DlgResult = vbCancel Then
Quit
End If
End If
Loop Until (Dlg <> «»)
OpenFile = Dlg
End If
End Function

Function OpenFolder
Dim oF, lSelect
Set oF = oSA.BrowseForFolder(0, Mess(15), 16)
lSelect = Not (TypeName(oF) = «Nothing»)
If lSelect Then
OpenFolder = oF.Self.Path
End If
Set oF = Nothing
If Not lSelect Then
Quit
End If
End Function

Function GetPath(pPath)
GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

Sub Quit
Set Errors = Nothing
Set Depth = Nothing
Set Mess = Nothing
Set FSO = Nothing
Set oSA = Nothing
Set WSH = Nothing
WScript.Quit
End Sub

В шапке скрипта можно по желанию изменить константу Overwrite значением True или False — признак перезаписи существующих файлов.

Параметры для разных вариантов использования:

* Копирование выделенных файлов\папок в противоположную панель ТС:

* Копирование файлов\папок из файла-списка в противоположную панель ТС:

* Копирование файлов\папок из файла-списка в указанную целевую папку:

* Копирование выделенных файлов\папок в указанную целевую папку:

* Копирование файлов\папок из файла-списка под курсором в указанную целевую папку:

* Копирование выделенных файлов\папок в выбираемую при запуске папку:

* Копирование файлов\папок из выбираемого при запуске файла-списка в выбираемую при запуске папку:

Не русскоязычные пользователи могут соотвествующим образом изменить процедуру SetMess.

Добавлено: Теперь, если второй параметр пустой («»), целевую папку можно указать вручную.

Добавлено: Теперь, если первый параметр пустой («»), файл-список можно указать вручную. Изменен способ копирования. Добавлен вариант копирования (2) с полным копированием структуры.

Добавлено: Теперь у представленных в файле-списке файлов\папок игнорируется префикс «file://localhost/».

Добавлено: Теперь в параметрах можно использовать переменные окружения.

Исправлено: Если первый параметр пустой («»), на Windows Vista ошибка не возникает, и путь к файлу-списку нужно вводить вручную.

Отправить комментарий

Приветствуются комментарии с полезной информацией: уточнениями, дополнениями, вопросами. Очень хорошо, когда вы делитесь своим опытом. Ваш опыт и информация, могут быть полезны другим.
Категорически запрещено в комментариях использование ненормативной лексики (в том числе нецензурную речь). Комментарии со спамом и рекламой, не пройдут модерацию.
Все комментарии, проходят модерацию и публикуются только после рассмотрения и одобрения.

Похожие статьи