получить все имена файлов в подкаталогах

За исключением математической части, вот быстрый и грязный POC для выполнения того, что вы собираетесь сделать, но с использованием оператора «if» вместо условий цикла «пока» для вашей логики.

#!/bin/bash

port=$1
echo $port | while read a; do
found=$(cat /etc/services | grep -Eo '[0-9]{1,5}/' | sed 's/^/ /' | grep ' '$a'/')
if [[ $found ]];
then echo port $a is being used
else echo port $a is not being used
fi
done

Редактировать: проблема возникла из-за переменной $found. одинарные кавычки в grep заставляют $port интерпретироваться буквально, поэтому он ищет строку Например, '$port/' вместо '80/'. исправить: просто измените одинарные кавычки на двойные кавычки.

found=$(cat /etc/services | grep -o "[[:space:]]$port/" | wc -l)

0
18.02.2017, 16:21
3 ответа

Поскольку мы знаем, что файлы, имена которых мы хотели бы иметь, находятся на двух уровнях под / usr / share / terminfo , и что под ними нет дополнительных каталогов, это будет быстро решение (выполняет только find и cut один раз):

$ find /usr/share/terminfo -type f | cut -d '/' -f 6

В качестве альтернативы, с одной чуть более «тяжелой» заменой sed :

$ find /usr/share/terminfo -type f | sed 's#^.*/##'

The sed Подстановка удаляет все, включая последнюю / каждой строки вывода из find .

1
28.01.2020, 02:16

1 Используя tree

(man tree для деталей)

tree -i /usr/shar/terminfo

или, если хотите, удалите каталоги:

tree -iF /usr/shar/terminfo | grep -v /

2 Используя ls

ls -R /usr/share/terminfo  | grep -v /
ls /usr/share/terminfo/*/* | grep -o '[^/]*$'

basename -a $(ls /usr/share/terminfo/*/*)
1
28.01.2020, 02:16

find / usr / share / terminfo -type f -exec basename {} \;

3
28.01.2020, 02:16

Теги

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