Я борюсь с некоторым кодом, который я писал весь день, и я в замешательстве, в основном, что код, как предполагается, делает, производится .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
Ваш сценарий является действительно путем, более сложным, чем это должно быть. И Вы получаете ошибки (между прочим, действительно полезно при фактическом показе ошибок, Вы добираетесь), потому что Вы выполняете его как обычный пользователь, и у Вашего пользователя нет полномочий чтения для всех каталогов под /
. Для предотвращения этих ошибок или запустите скрипт как корень или перенаправьте ошибку к 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
, Вам просто не нужен тот файл во-первых.$
перед каждой переменной Вы говорите этому печатать. echo ${foo}{bar}
повторит значение переменной foo
и затем строка bar
, Вам нужно echo ${foo}${bar}
повторить значения обеих переменных.sudo
.