我不希望脚本中的 ls 命令在屏幕上打印结果

我不希望脚本中的 ls 命令在屏幕上打印结果

我对文件 rainforest31_*.xvg 运行“ls -lX”。我运行一个命令,搜索 ls 命令输出第五列的数字,该数字大于 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”的结果(我不想要)。我怎样才能让我的脚本像屏幕上的命令一样运行,并且只打印所需的行数?

答案1

您的脚本将把管道中的每个命令打印到终端,因为您使用该-x标志运行它。来自man bash

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

但是,您使用的方法ls并不是wc计算文件数量的最佳方法。


要查找 >= 20000 的文件,您可以使用寻找

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

(因为如何找到解释器 + 符号(大于四舍五入)你得到 n+1,因此奇数
-size n

计数输出:
(当我们计算文件数量时,我们只打印换行符,因为我们实际上不需要输出)

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

-最大深度 n
  下降到起点以下最多几级(非负整数)的目录层级。
-尺寸 n
  文件使用 n 个空间单位,向上舍入。
-ls
  在标准输出上以 ls -dils 格式列出当前文件。

答案2

更新答案

发布问题中使用的脚本后发现:

#!/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

相关内容