Сценарий оболочки — Печать каталогов/файлов и номеров файлов

#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> , а затем перечисляет его содержимое.