#linux #shell
Вопрос:
Я пытаюсь написать оболочку, которая может печатать каталоги и файлы в ней. Я хочу добавить номер (для цикла) к файлам в нем, но возникли проблемы — можете ли вы, эксперты, разобраться в этом и помочь мне? Спасибо
#!/bin/sh
BDIR=$1
rm dir.log
counter(){
for file in "$1"/*; do
if [ -d "$file" ]; then
echo "$file"
counter "$file"
fi
done
}
counter "$BDIR" > dir.log
while read -r line; do
echo "n Directory Name => $line"
echo " This Directory has following File in it...."
pfile=`ls -l $line/ | awk 'NR>1{print " ==> " $9;}'`
cnt=`ls -l $line/ | awk 'NR>1{print $9;}' | wc -l`
for i in $cnt; do
echo "$i. $pfile"
done
done < dir.log
### Output
$ ./dr5.sh /home/test
Directory Name => /home/test/scripts
This Directory has following File in it....
3. ==> d_name.sh ----------> should have 1
==> test1 -------------> should have 2
==> test2 -------------> should have 3
Directory Name => /home/test/test
This Directory has following File in it....
1. ==> one
Directory Name => /home/test/test/one
This Directory has following File in it....
1. ==> t.sh
Комментарии:
1. Почему вы не должны анализировать выходные данные
ls
2. Также смотрите BashPitfalls re:
for i in $anything
.3. … Рассмотрите возможность запуска сценария в целом через shellcheck.net
Ответ №1:
Решено — Обновлен цикл while со следующим — было проще, чем ожидалось 🙂
cd $line
ls -l | awk 'NR>1{print " => " $9}' > cnt.txt
cat --number cnt.txt
Ответ №2:
Чтобы подсчитать количество файлов в каталоге, вы можете сделать:
find ./ -type f | wc -l
Это включает в себя подкаталоги. Если вам нужно количество файлов только в главном каталоге, вы можете сделать:
find ./ -type f -maxdepth 1 | wc -l
Это гораздо надежнее, чем ls
подсчет парсинга.
Ответ №3:
Если у вас есть следующая структура каталогов:
$ tree
.
├── dir2
│ └── file3
├── file1
└── file2
$ find . -type d | xargs -I % sh -c "echo in file '%' ; ls '%' | nl"
in file .
1 dir2
2 file1
3 file2
in file ./dir2
1 file3
find . -type d
выводит все каталоги и подкаталоги в разделе и включая.
.xargs
выполняетсяsh -c "echo in file '<dir>' ; ls '<dir>' | nl"
для каждогоfind
предоставленного каталога. Который печатаетin file <dir>
, а затем перечисляет его содержимое.