Я не хочу, чтобы моя команда ls в моем сценарии распечатала результаты на экране

Я выполняю "ls-lX" по файлам umbrella31_*.xvg. Я выполняю команду, которая ищет число на пятой колонне вывода команды ls, который больше скажем, чем 20 000. Это похоже на это:

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
задан 11 October 2019 в 04:32

2 ответа

Ваш сценарий распечатает каждую из команд в Вашем конвейере к терминалу, потому что Вы выполняете его с -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)

- maxdepth n
  Убывание на большинстве уровней (неотрицательное целое число) уровни каталогов ниже отправных точек.
- размер n
  Файл использует n единицы пространства, окружая.
- ls
  Перечислите текущий файл в ls-dils формат на стандартном выводе.

16
ответ дан 23 November 2019 в 07:16

Обновленный ответ

После регистрации сценария использовал в вопросе, это было обнаружено:

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

В моей системе, ища сценарии удара это работает как так:

$ 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
ответ дан 23 November 2019 в 07:16

Другие вопросы по тегам:

Похожие вопросы: