Edited at

個人的に詰まったポイントメモ #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自体が無い。