ディレクトリ内の特定ファイルをソートして先頭の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に渡す
この手のシェルスクリプトは手を動かして覚えておくべき。