Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
Linuxでファイル名の一括変換を行う方法を紹介します。 1.問題点 あるディレクトリに次の10ファイル(あるいはそれ以上)があるとします。 aaa.txt bbb.txt ccc.txt ddd.txt eee.txt fff.txt ggg.txt hhh.txt iii.txt jjj.txt これらのファイルの拡張子をすべて「.html」に変更したいのですが、mvコマンドで1ファイルずつ、 $ mv aaa.txt aaa.html $ mv bbb.txt bbb.html : とリネームを繰り返すのは面倒です。 ということで、ファイル名の一括変換について紹介します。 2.renameコマンドで一括置換する Linuxにはrenameコマンドが用意されている場合があるので、利用できる場合はこれで一括変換が可能です。 $ rename .txt .html * フォーマットは次のと
ずいぶん久々の更新です。 はてなブログってなんですか? うそです。YAPCで発表聞いたので知ってます。 はてなBって書いたら、ブックマークなのかブログなのかわからんす。。。 日付妥当性 雑談はおいておいて、本題です。 yyyymmdd.log みたいなファイルを吐き出してて、そのファイル名をほげほげしようと思ったので、間違ったファイル処理してないかチェックしたいな、と思った。 1 #!/bin/bash 2 3 DATES="20110228 20110229" 4 for DATE in $DATES; do 5 if [ "`date +'%Y%m%d' -d $DATE 2> /dev/null`" == $DATE ]; then 6 echo "$DATE is ok" 7 else 8 echo "$DATE is ng" 9 fi 10 donedate に日付食わせて、同じ
date コマンドをさらに、見なおしてみた。意外と使えるんじゃないかと思うんですね。 dateコマンドを活用するのに最初に覚えること ”+ 1day” %F オプション これを覚えとくだけで、そこそこ使い勝手がいい。 実例 ある日から90日後を探す takuya@atom:~$ date --date "2012/11/22 + 90days" +"%F" 2013-02-20ね?便利でしょ --date で日付を指定 +"%F" で %Y-%m-%d の省略形 takuya@atom:~$ date --date "2011/11/22" +"%F" 2011-11-22最初に、以上を覚えておけば、直ぐ使えます。 それでは、使い込んでみましょう 相対的日時を求める ある日から、一ヶ月後 takuya@atom:~$ date --date "2012/11/22 + 1month" +"
[2014/09/27追記]CVE-2014-7169を加えて修正 [2014/10/09追記]CVE-2014-7186, CVE-2014-7187, CVE-2014-6277, CVE-2014-6278を加えて追記 巷ではbashの脆弱性(CVE-2014-6271,CVE-2014-7169,CVE-2014-7186,CVE-2014-7187,CVE-2014-6277,CVE-2014-6278)が問題になっている。内容が内容だけに、外につながっているいないに関わらず、社内にCentOS4の装置が残っている当方としては少し心配。 検索してみると、下記の質問が見つかった。 For reasons too stupid for me to explain in public, I am responsible for a server running RHEL 4 and w
いつものように yum でのアップデートを確認していたら、bashのアップデートが入っていたので何事と思っていると、bash に重大な脆弱性が見つかったようです。 Mac OS X も影響を受けるとの事。 さっさと対応しておきましょう。 2014/9/25 22~23時頃 一部追記。 はじめに 以下で報告されています。 Bash Code Injection Vulnerability via Specially Crafted Environment Variables (CVE-2014-6271) Vulnerability Summary for CVE-2014-7169 JPCERT の注意喚起によると、パッチの適用だけでは不十分との事です。 GNU bash の脆弱性に関する注意喚起 ※シェルショック ( Shellshock ) とも言うらしい。ハートブリード ( Hear
これはコマンドの標準出力を1行ずつ f という変数に読み込んで何らかの処理を行うってやつです。 whileの中でやることがファイル操作などの一般的なことならこれで全然問題ないんですが、実行中のシェル環境に対する処理(具体的には変数の設定など)を行おうとすると期待通りにいってくれなくなります。例えばこんな感じ↓ # findで見つけたファイル名をfilesという配列変数に詰め込みたい files=() find -type f | while read -r f; do files+=("$f") done echo "${files[@]}" # 確かにfilesに値を入れた筈なのに空が出力される?? これはパイプで繋げると後ろのwhileがサブシェルで実行されてしまうために起こる現象です。噛み砕いて説明すると… 現在findを実行中のbashとは別に、パイプの後ろでもう一つのbashが起
標題のテーマ、今までリダイレクト使ってまどろっこしいことしていた。 # sed -e "s/AAA/ZZZ/g" INFILE.txt > OUTFILE.txt # cp OUTFILE.txt INFILE.txt つまり、一度OUTFILE.txtに置換内容を吐き出してから、OUTFILE.txtをオリジナルのINFILE.txtに反映、とするやり方。しかし!-iオプションを使えば断然スマートにできることを今さら知る。 # sed -i -e "s/AAA/ZZZ/g" INFILE.txt これだけで、対象ファイルが上書き編集される。これにはちょっと感動。 以下のようにすればバックアップファイルもとってくれる。-iとダブルクォーテーションの間は詰める。 # sed -i".org" -e "s/AAA/ZZZ/g" INFILE.txt これをどういう時に使いたいかというと、通常の
最終更新 2019-01-27 UNIX/Linux のシェル sh・bash・csh・tcsh のリダイレクトを説明する。ファイルへの出力、コマンド出力を別のコマンドの入力とする、標準入力・標準出力・標準エラー出力、パイプなどもあわせて説明する。
最終更新 2019-01-22 UNIX/Linux の find コマンドは、ファイル名・タイムスタンプ・ファイルサイズ・オーナー・グループ・ファイルタイプなどを元に、ファイルやディレクトリを検索するコマンドである。AND・OR の組み合わせや正規表現が使えたり、検索だけではなくコマンドの実行も可能など、非常に強力なコマンドである。
→ 他のプログラミング言語と同様に = を使用する。 シェルスクリプトでも C言語などと同様に = を使用することで変数に値を設定することができる。ただし、C言語とは違い = の前後にスペースがあってはいけない。 また、変数名の大文字と小文字は区別されるため変数 VAR と変数 var は別物として扱われる。さらにシェル変数に「型」は存在しないので、文字列や数値を区別なく設定できる。 ポイントをまとめると以下のとおりとなる。 = を使う 値の設定時は変数名の先頭に $ を付けない ($ は参照時のみ) = の前後にスペースを入れない (前後にスペースがあるとエラー) 型は存在しない (declare コマンドや typeset コマンドで似たようなことができるが推奨はしない) 変数名の大文字・小文字は区別される (VAR と var は別物) 特に「2」は初心者が犯しがちなミスなので注意す
while 文の使用方法 while 文とは? while 文は「ある条件が成り立っている間のみ繰り返し処理を実行する」といった、不定回の繰り返し処理を行う場合に使用するループ制御文である。 一般的に処理回数が明確である場合には for 文を用いるが、処理回数が開始時点では不明確な場合はこの while 文を用いる。 while 文は始めに指定された条件式の終了ステータスを判定し、結果が真である場合のみループ処理を継続する。ループ毎に条件式を評価し真であれば処理を実行する。これを繰り返し、条件式が偽になった時点でループ処理をを終了する。 → 処理回数が開始時点では不明確なループ処理には while 文を使用する。 while 文にはループの継続条件となる条件式を指定する。条件式には test コマンドを使用するのが一般的だが、当然その他のコマンドも使用可能である。 while 文により条件
どうしてもシェルで連想配列が使いたければ zsh でも使えばいいんでしょうが、修行の一環として bash で連想配列もどきを作ってみました。 ※追記 bash 4.0 から連想配列が導入されたみたいです。が、キーの一覧を取得する方法が見当たりません。declare -p で連想配列の中身を見ることはできますが、厳しいです。詳細は info bash を見て下さい。 以前 “ゲームで極める シェルスクリプトスーパーテクニック” という本を読んだんですが、そこで確か配列を eval の力で実装してたと思います。それが基になってます。 #!/bin/bash array_get_index () { if [ $# -ne 2 ]; then echo "usage: array_get_index array val" exit 1 fi local len eval 'len=${#'"$1
入力と出力 リダイレクションとパイプ コマンドの実行結果は通常、標準出力であるディスプレイに出力される。この実行結果はリダイレクション(>、>>)やパイプ(|)を使用することにより、ディスプレイではなくテキストファイルやコマンドに対して出力するように切り替えることができる。 また、リダイレクションはコマンドの出力先をテキストファイルに切り替える以外にも、これとは逆にコマンドへの入力元をテキストファイルに切り替えることもできる。 なお、リダイレクションとパイプは次のように使い分ける。 リダイレクション データを渡す対象がファイルである場合はリダイレクションを使用する。 パイプ データを渡す対象がコマンドである場合はパイプを使用する。 リダイレクション [>, », <] コマンドの出力を file へ上書きする → コマンドの実行結果の出力先を、ディスプレイからファイルへ切り替えたい場合は、
bash のシェルスクリプト内で、カンマ区切りテキストを分割して変数に入れたい場合。Perl や PHP の split みたいな動作をさせる方法です。 IFS 変数に区切り文字をセットしたうえで set コマンドを使用します。 #!/bin/bash TEXT='AAA,hoge,2345' IFS=',' set -- $TEXT echo $1 echo $2 echo $3 set コマンドはタブや空白区切りの値を $1, $2, $3, ……に代入します。IFS を変更することによりカンマ区切りに対応できます。 もしくは tr コマンドでカンマを空白に置き換えて配列に代入します #!/bin/bash TEXT='BBB,データ,3456' arr=( `echo $TEXT | tr -s ',' ' '`) echo ${arr[0]} echo ${arr[1]} echo
test コマンド ファイル形式のチェックや数値・文字列比較を行うコマンド 構文 test [条件] 条件 -b ファイル名:指定したファイルがブロックデバイスファイルなら真 -c ファイル名:指定したファイルがキャラクタファイルなら真 -d ファイル名:指定したファイルがディレクトリなら真 -f ファイル名:指定したファイルが通常ファイルなら真 -L ファイル名:指定したファイルがシンボリックリンクなら真 -h ファイル名:-Lと同じ -p ファイル名:指定したファイルが名前付きパイプなら真 -S ファイル名:指定したファイルがソケットなら真 -t ファイル名:指定したファイルディスリプタが端末で開いている -g ファイル名:指定したファイルがsed gidされているなら真 -k ファイル名:指定したファイルにskickyビットで立っているなら真 -r ファイル名:指定したファイルが読
条件式と繰り返しによるスクリプトの制御 条件判断 引数によって実行時にパラメータを与えることができるようになりました。次に欲しくなるのは、条件判断でしょう。つまり、特定の条件が満たされたときだけコマンドを実行するということです。このための構文が「if文」で、 という構造で使います。このうち「elif」はなくてもよいですし、好きなだけ繰り返すこともできます。また、「else」は使わない、あるいは1回だけ使えます。 ここで注意が必要なのは、条件が式ではなく文であることです。すなわち、一般的な真偽によって実行するかしないかを決定するのではないのです。では一体何をもって判断するのかというと、実行した文の「終了ステータス」です。 Linuxでは、あらゆる実行ファイルが終了時に自分自身を呼び出したプロセスに対して整数のコードを返します。これが終了ステータスで、普通は正常に終了したときに「0」を、エラー
CUIの世界で暮らす場合、シェルの使いこなしで作業効率は桁違いに変わる。シェルは一種類だけではないが、シェルスクリプトの観点からはsh系とcsh系に分けられる。sh系であるbash(zshでもOK?)をメインに使ってみることにする。純粋な /bin/sh を使うと、declareが使えず、exprとなるのが面倒。 link * ステップ・バイ・ステップ・シェルスクリプト bashで始めるシェルスクリプト基礎の基礎 シェルスクリプトの基礎 画像整理における実例 * あえて全部別々に記述してみた。 jpegファイルで、大文字の拡張子を小文字にする(JPG -> jpg) * for filename in *.JPG do mv ${filename} ${filename%JPG}jpg done ダメ写真を削除したなどで、連番が歯抜けとなったjpegファイル群に番号を振りなおす * dec
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く