銀色うつ時間

思い出すたび何か胸につっかえてるだけ

ディレクトリ内の特定ファイルをソートして先頭のn件取得したい

詰まったのでメモ。

特定ファイルを削除

.
+-- hoge
       +-- foo3.txt
       +-- foo2.txt
       +-- foo1.tx
       +-- bar3.sh
       +-- bar2.sh
       +-- bar1.sh

こんな感じのディレクトリを想定。 ここから

  • .shファイルのみソートして
  • フルパスで
  • 先頭の2件のみ取得して
  • 削除したい

以下のようなコマンドで実現できる。

DIR=`pwd`
/bin/ls -A ${DIR}/*sh | awk '{print("'${DIR}'"$1)}' | sort | head - 2 | xargs rm

重要なのは以下の事柄。

  • rcファイルでコマンドにオプション付きのaliasを設定している場合にデフォルトだと競合してしまうことがある
  • フルパスでコマンドを記述するか、\lsのようにバッククォートを使う
  • lsの-Aオプションで...のディレクトリを除外できる
  • awkコマンドでシェル変数を展開したい場合は、シングルクォートの外に記述する(少々泥臭いのでfind使ったほうが健全かもしれない。また、パスを環境変数に入れるのが少々駄目っぽいのでやはりfindがよさそう)

おまけ

末尾からの件数を出力する場合は、tailコマンドの-nオプションが便利だ。tail -n 5で末尾から5行分出力してくれる。また、+10といったオプションで先頭10行目から末尾まで出力するすることもできる。例えば、10件中先頭2件を残して削除したい場合は、以下のようにする。

LENGTH=`\ls -A | wc -l` # 10
\ls -A | tail +3 | xargs rm #3行目から出力しxargsに渡す

この手のシェルスクリプトは手を動かして覚えておくべき。