Skip to content

Instantly share code, notes, and snippets.

@rsgrafx

rsgrafx/rewrite.exs

Last active Jan 29, 2016
Embed
What would you like to do?
elixir rewrite folder structure from filenames.
#
# Specifically written for - this problem with folders unzipped from this https://www.prepbootstrap.com website.
# may be able to help someone solve similar issue.
#
# Problem: Folder contains no folder structure - but hints at them in the file names:
# /
# Theme-LightWayAdmin\blog.html
# Theme-LightWayAdmin\font-awesome\less\list.less
# Theme-LightWayAdmin\bootstrap-elements.html
# Theme-LightWayAdmin\font-awesome\less\mixins.less
# Theme-LightWayAdmin\bootstrap-grid.html
# Theme-LightWayAdmin\font-awesome\less\path.less
# Theme-LightWayAdmin\bootstrap\css\bootstrap.css
# Theme-LightWayAdmin\bootstrap\fonts\glyphicons-halflings-regular.woff2
# ...
# .exs file is ../ to target folder
# Does directory ls - reads in each file / regexs and builds folder structure
# Then copy's original file into that structure.
defmodule Elixirfolders do
# List all files in this folder
def start(url) do
url
|> folder
|> File.ls()
|> run(url)
end
defp folder(url) do
url
|> Path.absname
end
defp run {:ok, files}, url do
File.cd(url)
files
|> Enum.drop_while(fn(x) ->
x == ".DS_Store"
end)
|> Enum.drop_while(fn(x) ->
File.dir?( Path.absname(x) )
end)
|> capture
end
defp run(_), do: IO.puts "No files found"
defp capture([]), do: IO.inspect("no more files")
defp capture([h | tail]) do
items = Regex.split(~r/\\/, h)
make_folders(items, h)
capture(tail)
end
defp make_folders(items, oldname) do
{ url, filename } = folder_struct(items)
_url = url |> folder
_file = oldname
|> Path.absname
# |> IO.inspect
if File.dir?(_url) do
File.cp!(oldname, "#{_url}/#{filename}")
|> IO.inspect
end
end
defp folder_struct(list) do
filename = List.last(list)
count = Enum.count(list)
url = list
|> List.delete_at((count-1))
|> Mkdir.folders
{url, filename}
end
end
defmodule Mkdir do
def folders(list) do
Enum.reduce(list, [], fn(x, acc) ->
z = acc ++ [x]
File.mkdir_p(Enum.join(z, "/"))
acc ++ [x]
end)
|> Enum.join("/")
end
end
Elixirfolders.start("./Theme-LightWayAdmin")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment