您的位置:首页 > 其它

按照时间排序并重命名文件

2016-10-01 00:00 239 查看
摘要: 按照时间排序来重命名文件列表,使用Elixir编程语言来实现。

iPhone照片每次重置手机后都会按照IMG_xxxx.JPG从1开始命名照片名字,当你多次操作的时候,便会有重名的情况。所以需要批量按照时间重命名所有的照片。
最开始想到使用Linux Shell来完成这个任务,后来想试一下Elixir,完美解决。

IO.puts "Hello Cjl"

# filter and sorted by date_time
sorted_files = File.ls!
|> Enum.filter( fn f -> f != ".DS_Store" && f != "hw.exs" end)
|> Enum.sort( fn(f1, f2) ->
md1 = File.lstat!(f1).mtime |> Tuple.to_list |> Enum.map(fn f -> Tuple.to_list(f) end ) |> Enum.flat_map(fn f -> f end) |> Enum.reduce("", fn (x, acc) -> acc  <> (x |> Integer.to_string |> String.rjust(4, ?0) ) end )
md2 = File.lstat!(f2).mtime |> Tuple.to_list |> Enum.map(fn f -> Tuple.to_list(f) end ) |> Enum.flat_map(fn f -> f end) |> Enum.reduce("", fn (x, acc) -> acc  <> (x |> Integer.to_string |> String.rjust(4, ?0) ) end )

md1 < md2
end)
# |> Enum.each(fn (f1) ->
#   idx = Enum
#   md1 = File.lstat!(f1).mtime |> Tuple.to_list |> Enum.map(fn f -> Tuple.to_list(f) end ) |> Enum.flat_map(fn f -> f end) |> Enum.reduce("", fn (x, acc) -> acc  <> (x |> Integer.to_string |> String.rjust(4, ?0) ) end )
#
#   IO.puts md1 <> " " <> f1
#  File.rename(f1, "xx")
# end)

# 重命名文件,下面这段代码的出现是因为Enum.each没有索引idx。没有找到,望指点。
cnt = Enum.count sorted_files
Enum.each(0..(cnt-1), fn x ->
f = Enum.at(sorted_files, x)
IO.puts  Integer.to_string(x) <> "    " <> f
b = (x + 1) |> Integer.to_string |> String.rjust(4, ?0)
name  = "IMG_" <> b <> ".JPG"
File.rename(f, name)
end)

pipe操作还算优雅
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Elixir