Создать счетчик в сценарии оболочки, который будет увеличиваться каждый раз, когда файл из текущего каталога имеет более 8 строк?

Файл пары ключей ec2 -должен иметь ограниченное разрешение, и вам нужно сделать это с правами администратора. Без прав администратора он может не показывать никаких ошибок. Таким образом, вы можете подумать, что разрешение было изменено.

sudo su
chmod 400 ~/.ssh/transa.pem
-2
25.05.2020, 00:07
1 ответ
#!/bin/bash

shopt -s nullglob dotglob

long_files=()
short_files=()

for name in./*; do
        [[ ! -f $name ]] && continue

        numlines=$( wc -l <"$name" )

        if [[ numlines -gt 8 ]]; then
                long_files+=( "$name" )
        elif [[ numlines -lt 8 ]]; then
                short_files+=( "$name" )
        fi
done

printf 'There are %d files with more than 8 lines:\n' "${#long_files[@]}"
printf '\t%s\n' "${long_files[@]}"

printf 'There are %d files with less than 8 lines:\n' "${#short_files[@]}"
printf '\t%s\n' "${short_files[@]}"

Это сделает буквально то, о чем вы просили, перебирая все имена в текущем каталоге и разделяя имена на два списка (массивы ), long_filesи short_files, в зависимости от того, находятся ли файлы иметь более или менее восьми строк. Файлы ровно с восемью строками не сохраняются в списке. Имена, соответствующие не -обычным файлам (, т. е. каталогам и т. д. ), пропускаются с проверкой -fи оператором continue.

Количество строк рассчитывается с помощью wc -l, поэтому нет необходимости использовать счетчик для подсчета отдельных строк в файлах.

Сценарий устанавливает параметры оболочки nullglobи dotglob, что позволяет корректно работать с полностью пустыми каталогами и со скрытыми файлами.

В конце выводятся два списка.

Пробный запуск:

$ bash script.sh
There are 1 files with more than 8 lines:
       ./script.sh
There are 3 files with less than 8 lines:
       ./.bash_profile
       ./.bashrc
       ./.zshrc

Чтобы создать два файла со списками в них, либо распечатайте списки в файлы в конце приведенного выше скрипта с помощью

printf '%s\n' "${long_files[@]}"  >long_files.list
printf '%s\n' "${short_files[@]}" >short_files.list

или печатать в файлы в основном цикле программы, вместо добавления имен в массивы:

#!/bin/bash

shopt -s nullglob dotglob

rm -f long_files.list short_files.list

for name in./*; do
        [[ ! -f $name ]] && continue

        numlines=$( wc -l <"$name" )

        if [[ numlines -gt 8 ]]; then
                printf '%s\n' "$name" >>long_files.list
        elif [[ numlines -lt 8 ]]; then
                printf '%s\n' "$name" >>short_files.list
        fi
done

Чтобы подсчитать количество файлов длиннее восьми строк, используйте переменную-счетчик, которая увеличивается при обнаружении длинного файла,или, если вы используете массивы длинных и коротких файлов, получите количество длинных файлов с помощью "${#long_files[@]}"после цикла (, как показано в первой части кода ).

5
18.03.2021, 23:34

Теги

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