web-dev-qa-db-ja.com

awkによって除外されたファイルを削除する方法

ディレクトリに次のファイルがあります。

-rw-r--r-- 1 smsc sys  46 Apr 22 12:09 bills.50.1.3G.MO.X.20120422120453.Z
-rw-r--r-- 1 smsc sys  28 Apr 22 12:15 bills.50.1.3G.MO.X.20120422120953.Z
-rw-r--r-- 1 smsc sys  46 Apr 22 12:20 bills.50.1.3G.MO.X.20120422121453.Z
-rw-r--r-- 1 smsc sys  46 Apr 22 12:25 bills.50.1.3G.MO.X.20120422121953.Z

5番目の列はファイルのサイズです。サイズが46のすべてのファイルを削除したいと思います。これらのファイルをフィルターで除外するには、次のコマンドを使用しました。

ls -ltr | awk '$5 ~ /46/ {print $0}'

うまくいきます。しかし、今は除外されたすべてのファイルを削除したいので、上記のコマンドに以下を追加します。

ls -ltr | awk '$5 ~ /46/ {print $0}' | xargs rm

ただし、次のエラーが表示されます。

rm: invalid option -- w

findではなくlsを使用する必要があるようですので、以下の形式で出力を取得します。

./bills.50.1.3G.MO.X.20120421050453.Z
./bills.50.1.3G.MO.X.20120421154953.Z
./bills.50.1.3G.MO.X.20120419133452.Z

しかし、そのパラメーターでファイルをフィルターする方法はありません。このタスクはどのように実行できますか?

4
Eugene S

次の2つのバグがあります。

  1. 含む46;のサイズを比較しています。 と等しい 46にしたい。

  2. ファイル名のみが必要な場合は、行全体を印刷します。

また、追加の問題:並べ替え順序を使用していないときにls出力を並べ替える-ltrのポイントは何ですか?

あなたは次のようなことをしたいです

ls -l | awk '$5 == "46" {print $9}' | xargs rm

あなたを除いてしないでくださいそれをしたいのですが、現時点では安全かもしれませんが、ls出力の解析は信頼できません。次のような適切なツールを使用します

find . -maxdepth 1 -size 46c -delete # requires GNU find

(POSIX findには、ブロック以外の単位で動作する-maxdepthまたは-sizeがないため、これを移植性の高い方法で行うのは面倒です。Perl/ Python /でスクリプトを書く方が適切です。ファイル名の特殊文字で問題が発生しない適切なディレクトリスキャンを使用できるRubyなど。)

12
geekosaur

Zshでは、現在のディレクトリ(1行目)または現在のディレクトリとそのサブディレクトリ(2行目)にあるサイズ26のすべてのファイルを削除するには、Lglob qualifier を使用します。

rm *(L26)
rm **/*(L26)

GNUまたはFreeBSD/NetBSD/OSXの場合:

find . -name . -o -type d -Prune -o -type f -size 26c -exec rm {} +
find . -type f -size 26c -exec rm {} +

ポータブル:

find . -name . -o -type d -Prune -o -type f -exec sh -c '[ $(wc -c <"$0") -eq 26 ] && rm -- "$0"' {} \;
find . -type f -exec sh -c '[ $(wc -c <"$0") -eq 26 ] && rm -- "$0"' {} \;

findは、ここでの最良のオプションです。 stat を使用すると、lsを使用せずにファイルサイズを確認できます

for file in *; do
  (( $(stat -c %s "$file") == 46 )) && rm "$file"
done
0
glenn jackman