ShellScript
Linux

個人的に詰まったポイントメモ #linux

適宜追加/編集予定

シェル

エラーハンドリング

  • エラー値返す前に処理を挟みたい。
    • 解凍→どっちにしろ削除(出来たかは見てない)→エラー処理(以下)みたいな事をしたい場合。
      • unar "${file}" && rm "${file}" || rm "${file}" ; exit 1
        • どう足掻いてもexit 1
        • ;を改行として考えると分かりやすいかもしれない。
      • unar "${file}" && rm "${file}" || (rm "${file}" ; exit 1)
        • エラーが出た時だけexit 1される。
        • ()で括ると一つのコマンドとして認識される。

ディレクトリ操作

mv

  • No such file or directory
    • 移動させるファイル/ディレクトリが存在しないと出る。
    • 移動先の途中ディレクトリが無くても出る。
  • 移動+リネームをしたい
    • sourece/beforetarget/afterに変更したい場合。
      • mv source/before target/after
        • でもtarget/after/beforeとなる。あれ?
        • 移動後のディレクトリが存在する場合こうなる。
      • mv -T source/before target/after
        • target/afterに移動+リネーム出来る。
        • ただ、target/afterが空ディレクトリでないとエラーを吐く
          • mkdir -p target/afterでの自動生成と大体セット。
        • macOSに-Tオプションは無い

find

  • 空ディレクトリのみ検出
    • find . -type d -empty -delete(空ディレクトリを全削除)でよく使う。
      • でも-emptyが稀に無い。(alpienとか)
      • find . -type d -depth -delete 2>/dev/nullとかで対処
  • 検索パス指定
    • find . -iwholename "${dir}/*"とか
    • find . -not -iwholename "${dname}/*"で除外
      • 次工程でgrep -F "${name}"とかする為。
  • 文字コードをUTF-8に一括変更
    • find . -type f -name "*.py$" -exec nkf -wd --overwrite "{}" \;
    • 最後を\;ではなく+とするとfindした結果を一気に渡すので注意。
      • この場合、nkfが一気に渡しても問題無いので動くっちゃ動く。
      • ただ並列処理を考えると+より\;の方が良いかも。
        • +だと結果が揃うまで処理が進まないので。

grep

  • 重複確認
    • find . -type d | grep "${name}" | wc -l("${name}"の被り数検索)とか。 
      • でも欲しい結果にならない。
        • "${name}"にエスケープが必要な文字が含まれている可能性アリ。
          • \[]^$*.${}辺り。
        • -Fを使う。
          • find . -type d | grep -F "${name}" | wc -l
          • \[]^$*.辺りがちゃんとエスケープされる。
          • ${}は多分変数の為にエスケープされない。
            • 細かくは調べてない。

ファイル操作

unar

  • そもそもインストール出来ない場合がある(alpine)。
    • 余りにも面倒ならコンパイルしてしまうのも一つの手。
      • 自分は出来なかったので(面倒になって)諦めた。
    • そしてそれすら面倒になってUbuntuベースのdockerに切り替えてaptで入れるまでがセット。
  • 別コマンドで対応した場合、ほぼ間違いなく文字コード周りで面倒事が起こる。

unzip

  • unzip -O sjis "${zip}"でSJIS圧縮されたzipも解凍可能。
    • OSによる。
      • macOS 10.14.1で-O自体無いと言われた。
      • Alpineでも-O自体が無い。