2018年6月30日土曜日

ひとりシェル芸 を やってみたら便利すぎて仕事が楽しくなった

問題
200のzipファイルを、日にち付きのzipファイル名に大量にコピーするとき
しかも5分後に1秒ずつ加算されるファイル名で作ってくれよ!だって

「ls -1」で見るとこんな感じで200個ぐらい
a/
zip1.zip
zip10.zip
zip100.zip
zip101.zip
zip102.zip
zip103.zip
zip104.zip
...

ブランクで区切られてる1列名から2列目のように変換する
zip1.zip a/lib_img20180630184131.zip
zip10.zip a/lib_img20180630184132.zip
zip100.zip a/lib_img20180630184133.zip
zip101.zip a/lib_img20180630184134.zip
zip102.zip a/lib_img20180630184135.zip
zip103.zip a/lib_img20180630184136.zip
zip104.zip a/lib_img20180630184137.zip
...


答え
# # ls -1 | sed -e 's/\.zip//g' | grep zip | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | nl | awk '{print $2 ".zip " "a/lib_img"  strftime("%Y%m%d%H%M%S",systime()+$1+300) ".zip"}' | xargs -n 2 cp




ls -1
ディレクトリ内にあるファイルを 1行で1ファイル表示


sed -e 's/\.zip//g'
拡張子「.zip」を削除 


grep zip
ファイル名に zipと付いてる物だけ抽出

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
sed や grep すると色つくので消すさ作業
 
grepは、--color=never 色つかない。 

sedで、はじめから色つかない方法を知りたい! 


nl
行番号を入れてる
 

 awk '{print $2 ".zip " "a/lib_img"  strftime("%Y%m%d%H%M%S",systime()+$1+300) ".zip"}'
1列目に本のファイル名を入れて、2列めに変換予定のファイル名を入れてる。

unix time の現在の時刻値がsystime()
systime()+$1+300 で 行番号の数字足す5分(60秒×5) を足してる

strftime が 時刻を文字列に変換する


xargs -n 2 cp
コピーしてる。 aという名前のフォルダにコピーができてるはず。



仕事で困ったときのシェル芸ですね。シェル芸歴は短いが工夫次第でなんとかなるもんです。
あっ。なんの仕事かファイル名で分かる人は、わかるかも。