Как я делаю свои выходные данные сценария удара правильно?

Я борюсь с некоторым кодом, который я писал весь день, и я в замешательстве, в основном, что код, как предполагается, делает, производится .csv файл со всеми данными в предпоследнем операторе эха, вытягиваемом от / . Я не уверен, что проблема всего лишь, она не производит данные правильно и массово рассылает набор ошибок о du и find команда говоря, что у них нет разрешения получить доступ к различным папкам.

Если я не был ясен в своем вопросе, я разъяснюсь :)

Вот код:

#/bin/bash

cd /
#creates the list file
sudo touch ./home/etudiant/Desktop/main_list.txt
#lists all the files in /
find -maxdepth 1 -type d > ./home/etudiant/Desktop/main_list.txt
#adds one to the number of files in the list
let "list1=$(wc -l /home/etudiant/Desktop/main_list.txt | cut -f1 -d " ") + 1"

#self-explanatory
counter=1

while [ $counter -lt 25 ]
do
    filename1=$(head -n $counter /home/etudiant/Desktop/main_list.txt | tail -n 1)
    #goes to folder 
    cd /$filename1
    #size of folder
    size=$(du $filename1)

    #number of regular files (recursive till the end of time)
    reg_files=$(find -type f | wc -l)
    #number of sub-folders
    sub_folders=$(find -type d | wc -l)
    #number of links
    links=$(find -type l | wc -l)
    #number of executables
    executables=$(find -executable | wc -l)
    echo "${filename1};{size};{reg_files};{sub_folders};{links};{executables}" 2>> /home/etudiant/Desktop/data.csv
    ((counter++))
done
sudo rm /home/etudiant/Desktop/main_list.txt
echo Execution Complete
0
задан 17 December 2018 в 17:37

1 ответ

Ваш сценарий является действительно путем, более сложным, чем это должно быть. И Вы получаете ошибки (между прочим, действительно полезно при фактическом показе ошибок, Вы добираетесь), потому что Вы выполняете его как обычный пользователь, и у Вашего пользователя нет полномочий чтения для всех каталогов под /. Для предотвращения этих ошибок или запустите скрипт как корень или перенаправьте ошибку к dev/null путем добавления 2>/dev/null после каждой команды (или при вызове сценария script.sh 2>/dev/null).

Вот упрощенная версия:

#!/bin/bash

for d in /*/; do
  size=$(du -s "$d" | cut -f1)
  reg_files=$(find "$d" -type f | wc -l )
  sub_folders=$(find "$d" -type d | wc -l)
  links=$(find "$d" -type l | wc -l)
  executables=$(find "$d" -executable | wc -l)
  echo "${d};${size};${reg_files};${sub_folders};${links};${executables}" 
done

Некоторые общие сведения:

  • Вы не должны touch файл прежде, чем записать в него, просто запишите в него. Таким образом, Вы, возможно, сделали find -maxdepth 1 -type d > ./home/etudiant/Desktop/main_list.txt непосредственно, без touch, Вам просто не нужен тот файл во-первых.
  • Вашему эху нужен a $ перед каждой переменной Вы говорите этому печатать. echo ${foo}{bar} повторит значение переменной foo и затем строка bar, Вам нужно echo ${foo}${bar} повторить значения обеих переменных.
  • Поскольку я сказал выше, чтобы избежать ошибок, запустить Ваш скрипт с sudo.
3
ответ дан 26 October 2019 в 20:08

Другие вопросы по тегам:

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