1

У меня есть папка с сотней подпапок, и каждая из них содержит от 10 до 20 подпапок, так что в целом это довольно большое дерево папок.

Есть ли простой способ, которым я могу взорвать или экспортировать все файлы в дереве в новую папку, которая будет просто одна папка с файлами (без папок, без деревьев)?

Я использую OS X 10.8, хотя у меня также есть Parallels, поэтому, если есть решение для Windows, я могу просто запустить его, так как это не то, что мне нужно делать каждый день.

3 ответа3

5

В OS X это должно работать:

find /top/source/directory -type f -exec mv {} /destination/directory \;

Команда find ищет все подкаталоги в папке /top/source/directory и находит только файлы (опция -type f). Когда он находит его, он выполняет (-exec) команду mv для только что найденного файла ({}), чтобы переместить его в новый каталог /destination/directory .

Обратите внимание, что пробел перед \; абсолютно необходимо.

0

Этот ответ основан на Python, поэтому он должен работать как на OSX, так и на Windows, при условии, что вы устанавливаете Python (и для справки, это из головы).

import os
import shutil

path = "C:/dir"    # the directory tree you want to "explode"
store= "C:/store"  # where all files will be stored

for dirpath, dirnames, filenames in os.walk(path):

    name = ""
    for c in dirpath:
        if c != "/":    # if the character is different than the current directory character
            name += s
        else:
            name += "_" # "quick and dirty" way of resolving name conflicts

    for files in filenames:

        orig_loc = os.path.join(dirpath,files)
        copy_loc = os.path.join(store,name + "_" + files)
        shutil.copy2(orig_loc,copy_loc)

Это должно скопировать все файлы (плюс метаданные) из структуры path в папку store .

Если вас не волнуют конфликты имен, не используйте код между name = "" и for files in filenames выражениях имен файлов . Этот код выполняет преобразование / в _ и после этого добавляет очищенное имя каталога к именам файлов.

Это сохранит исходную структуру, которую вы можете затем удалить с помощью shutil.rmtree(path)

0

Это должно работать на стороне Windows в PowerShell:

Get-ChildItem -Path "C:\Source" -Recurse -Include *.* | Move-Item -Destination "C:\Destination\"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .