awkでフィルタリングされたファイルを削除する方法

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

findoverを使用しなければ、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

ただし、そのパラメータでファイルをフィルタリングすることはできません。これをどのように実行できますか?

答え1

2つのエラーがあります。

  1. 比較している寸法は含む 46;あなたはそうしたいです。同じ46.

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

そしてボーナスの質問:ソート順序を使用しないときに出力を-ltrソートすることのポイントは何ですか?ls

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

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

あなたを除くいいえ今は安全ですが、ls出力解析は信頼できないので、これをやりたいと思います。適切なツールを使用してください。

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

(これを行うと、POSIXはブロックでfindはなく単位で動作しないため、面倒です。ファイルをインポートせずに適切なディレクトリスキャンを使用できるPerl / Python / Ruby /などのスクリプトを書くことをお勧めします。問題があります。名前に特殊文字を含む)-maxdepth-size

答え2

zshから現在のディレクトリ(最初の行)または現在のディレクトリとそのサブディレクトリ(2行目)からサイズ26のすべてのファイルを削除するには、次のようにします。L グローバル予選:

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"' {} \;

答え3

findここが最善の選択です。あなたはそれを使用することができますstat使用せずにファイルサイズを探すls

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

関連情報