Všichni jistě umíme skriptovat v shellu… Já ne :-) Takže když jsem nedávno potřebovala hromadně upravovat obrázky, naučila jsem se u toho, jak skvěle se dají psát skripty v Elixiru.

Využila jsem elixirovou funkci System.cmd, pomocí které spustím příkaz, jako bych ho spouštěla na příkazové řádce, a ImageMagick.

Níže je skript, který k *-large.jpg obrázkům v daném adresáři vytvoří 100px -small verzi. Nejprve načte názvy vstupních souborů, vytvoří názvy výstupních souborů, a pak provede příkaz convert.

Tip: parametr -strip smaže případná metadata, čímž se obrázek podstatně zmenší.

"./*-large.jpg"
|> Path.wildcard()
|> Enum.map(& {&1, String.replace(&1, "-large.jpg", "-small.jpg")})
|> Enum.map(fn {input_file, output_file} ->
  System.cmd("convert", [input_file, "-resize", "100x", "-strip", "-quality", "92", output_file])
end)

Skript uložím do souboru s příponou .exs a pomocí příkazu elixir pak spustím:

$ elixir image-resize.exs

A další šikovný skript přejmenuje obrázky v podadresářích podle názvů příslušných adresářů. (Je to jen skriptík, takže pozor, pokud by se v adresáři už vyskytoval soubor se stejným názvem, bude přepsán.)

"."
|> File.ls!()
|> Enum.filter(&File.dir?/1)
|> Enum.map(fn folder ->
  "./#{folder}/*.jpg"
  |> Path.wildcard()
  |> Enum.with_index(1)
  |> Enum.map(fn {filename, index} ->
    File.rename(
      filename,
      "./#{folder}/#{folder}#{String.pad_leading(to_string(index), 3, "0")}.jpg"
    )
  end)
end)
├── ovoce                       ├── ovoce
│   └── 20190712.jpg            │   └── ovoce001.jpg
│   └── pic108.jpg              │   └── ovoce002.jpg
├── zahrada                     ├── zahrada
│   └── DSC87394.jpg            │   └── zahrada001.jpg
│   └── IMG20200507.jpg         │   └── zahrada002.jpg
│   └── photo20.jpg             │   └── zahrada003.jpg