如何使我的 bash 脚本正确输出数据?

如何使我的 bash 脚本正确输出数据?

我整天都在写一些代码,但一直都不知道该怎么做,基本上,代码应该做的是输出一个 .csv 文件,其中包含倒数第二个 echo 语句中的所有数据,这些数据都是从中提取的/。我不确定问题是什么,但它没有正确输出数据,并且发送了一堆关于duandfind命令的错误,说他们没有权限访问各种文件夹。

如果我的问题表达不清楚,我会澄清一下:)

代码如下:

#/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

答案1

你的剧本真的方式比实际需要的更复杂。而且您会收到错误(顺便说一句,如果您实际显示收到的错误,那真的很有帮助),因为您是以普通用户身份运行的,并且您的用户对 下的所有目录都没有读取权限。要避免这些错误,请以 root 身份运行脚本,或者通过在每个命令后(或调用脚本时)添加/将错误重定向到。dev/null2>/dev/nullscript.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 需要$在每一个您告诉它打印的变量之前加上 。echo ${foo}{bar}将会回显变量的值foo,然后是字符串bar,您需要echo ${foo}${bar}回显两个变量的值。
  • 正如我上面所说,为了避免错误,请使用 运行脚本sudo

相关内容