# File management sample codes?

**URL:** <https://forum.elixirforum.com/t/file-management-sample-codes/27613>\
**Category:** Questions\
**Tags:** file, example\
**Created:** [December 16, 2019, 4:50pm UTC](https://forum.elixirforum.com/t/file-management-sample-codes/27613 "2019-12-16T16:50:34Z")\
**Posts on this page:** 1\
**Showing post:** 5

<div class="post-metadata">

**Author:** ![Aetherus](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aetherus/32/17203_2.png) [@Aetherus](https://forum.elixirforum.com/u/Aetherus)\
**Post date:** [December 17, 2019, 9:17am UTC](https://forum.elixirforum.com/t/file-management-sample-codes/27613/5 "2019-12-17T09:17:26Z")

</div>

```elixir
defmodule sort_files_by_extension do
  def sort_files do
    File.ls!("./test")
    |> Enum.map(fn filename -> 
         extname = Path.extname(filename) #=> ".jpg"
         basename = Path.basename(filename, extname) #=> "IMG_XXXX"
         {basename, extname, filename}
       end)
    |> Enum.map(&make_extension_dir/1)
    |> Enum.map(&dedup/1)
    |> Enum.each(&move_extension_directory/1)

  defp make_extension_dir({_, "." <> extension, _} = arg) do
    File.mkdir_p!("./#{extension}")
    arg # just return the argument for other `Enum.map`
  end

  defp dedup(arg, suffix \\ 0)

  defp dedup({basename, "." <> extension, filename} = arg, 0) do
    if File.exists?("#{extension}/#{filename}") do
      dedup(arg, 1)
    else
      arg
    end  
  end

  defp dedup({basename, "." <> extension = extname, filename} = arg, suffix) do
    if File.exists?("#{extension}/#{basename}_#{suffix}.#{extension}") do
      dedup(arg, suffix + 1)
    else
      {"#{basename}_#{suffix}", extname, filename}
    end 
  end

  defp move_to_extension_directory({basename, "." <> extension, filename}) do
    File.rename!("./test/#{filename}", "./#{extension}/#{basename}.#{extension}")
  end
end

```

A few suggestions:

1. `Enum.each` is for pure side effects (e.g. pure file system operations). It’s not chainable. Use `Enum.map` instead.
2. You can wrap all the information in a tuple, and pattern match on it in the function parameters.
3. You can trust the file system to do the right thing (e.g. `File.mkdir_p!`)
4. Hail recursion!

---

_[View the full topic](https://forum.elixirforum.com/t/file-management-sample-codes/27613)._
