このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1153585095/640
# 【 課題 】
# 指定したフォルダの中身をフォルダの構成などを含めて完全にバックアップする
# ソフトを作成すること。
# 尚、バックアップファイルには以下の機能を持つようにすること。
# ・ 対象ファイルや除外ファイルを指定できるような
# 仕組みを持つこと。
# ・ バックアップ経過のログを作成すること。
# ログにはバックアップ処理の実行時間を出力すること。
# また、既にあるフォルダが指定された場合の対処についてもそれぞれ考慮して
# 機能の実装を行うこと。

# 作業に余裕のある人は以下の機能を追加すること。
# ・バックアップしたファイルを圧縮する仕組みの追加。
# ・プログラムが常駐する仕組みの追加。

t111(Dir,SaveDir) :-
    concat_atom(['cp -R ',Dir,' ',SaveDir],S),
    shs(S,_).

/*
    concat_atom(['ls -l ',Dir],S),
    shs(S,L),
    member(A,L),
    not(sub_atom(A,1,1,_,d)),
    concat_atom([Dir,/,A],FI),
    concat_atom([SaveDir,/,A],FO),
    copy(FI,FO),
    fail;
    true.
*/

shs(S,L) :- system(S,user_input,Input),get_lines(Input,L),close(Input).

get_lines(File,Lines) :- get_chars(File,L),chars_lines(L,Lines),!.

get_chars(Input,end_of_file,[]) :- !.
get_chars(Input,X,[X|R]) :- get_char(Input,Y),get_chars(Input,Y,R) .

get_chars(Input,L) :- get_char(Input,X),get_chars(Input,X,L),!.

chars_lines([],[],[]) :- !.
chars_lines(['\r'],[],[]) :- !.
chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!.
chars_lines(['\r','\n'|R],[],R) :- !.
chars_lines(['\n'|R],[],R) :- !.
chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z).

chars_lines([],[]) :- !.
chars_lines(L,[A|R2]) :- chars_lines(L,U,R),concat_atom(U,A),chars_lines(R,R2).

concat_atom([],'') :- !.
concat_atom([A|R],S) :- concat_atom(R,S2),atom_concat(A,S2,S).