Файл пары ключей ec2 -должен иметь ограниченное разрешение, и вам нужно сделать это с правами администратора. Без прав администратора он может не показывать никаких ошибок. Таким образом, вы можете подумать, что разрешение было изменено.
sudo su
chmod 400 ~/.ssh/transa.pem
#!/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[@]}"
после цикла (, как показано в первой части кода ).