web-dev-qa-db-ja.com

スクリプトのlsコマンドで結果を画面に出力したくない

「ls -lX」を、umbrella31 _ *。xvgファイルに対して実行します。 lsコマンドの出力の5番目の列の数値を検索するコマンドを実行します。これは、20000よりも大きいとしましょう。次のようになります。

ls -lX umbrella31_*log |  awk '{if($5 >=20000) {print}}' | wc -l

そして、数値(列5の数値が20000より大きい行の数)を出力します。

上記のコマンドをスクリプトに含めると:

#!/bin/bash -x


ls -lX umbrella31_*log |  awk '{if($5 >=20000) {print}}' | wc -l

それを実行すると、「ls」の結果も画面に表示されます(これは不要です)。スクリプトを画面上のコマンドのように動作させ、必要な行数だけを印刷するにはどうすればよいですか?

6

-xフラグを使用してスクリプトを実行しているため、スクリプトは、パイプライン内の各コマンドをターミナルに出力します。 Fromman bash

   -x        Print commands and their arguments as they are executed.

ただし、lsおよびwcを使用するアプローチは、ファイルをカウントするための最良の方法ではありません。


20000以上のファイルを見つけるには、 find を使用できます。

find -type f -maxdepth 1 -name 'umbrella31_*log' -size +19999c -ls

(インタプリタを見つける方法+符号(切り上げより大きい)のため、n + 1を取得します。したがって、奇数
-size n

count output:
(ファイルをカウントするときは、出力は実際には必要ないため、改行を印刷するだけです)

wc -l < <(find -maxdepth 1 -type f -name 'umbrella31_*log' -size +19999c -printf \\n)

-maxdepth n
開始点より下のディレクトリのほとんどのレベル(負でない整数)レベルを下ります。
-size n
ファイルはn単位のスペースを使用して切り上げます。
-ls
現在のファイルをls -dils形式で標準出力に一覧表示します。

17
bac0n

更新された回答

質問で使用されたスクリプトを投稿した後、それが発見されました:

#!/bin/bash -x

-xオプションがすべてのコマンドを端末に出力する場所で使用されました.

-xを削除すると、元の問題が解決しました。


元の回答

引数フラグインジケーターがないため、次のようになります。

ls lX umbrella31_*log |  awk '{if($5 >=20000) {print}}' | wc -l

代わりにこれでなければなりません:

ls -lX umbrella31_*log |  awk '{if($5 >=20000) {print}}' | wc -l

私のシステムでbashスクリプトを探すと、次のように機能します。

$ ls -lX *.sh
-rwxrwxr-x 1 rick rick 4183 Jul  1 10:48 aptfileparse.sh
-rwxrwxr-x 1 rick rick  339 Jul 24 17:26 checkrunning.sh
-rwxrwxr-x 1 rick rick  506 Jul 15 17:54 Downloads.sh
-rwxrwxr-x 1 rick rick   78 Jul  6 11:28 runall.sh

$ ls -lX *.sh | awk '{if($5 >=200) {print}}' | wc -l
3
4