带有目录输入的 Shell 脚本

带有目录输入的 Shell 脚本

我正在编写一个 shell 脚本,该脚本应该接受一个参数(目录名称)并显示该目录中有多少个文件、目录、可读文件、可写文件和可执行文件。如果运行时未给出参数,则应该显示错误消息并中止。如果给定的参数不存在,它还应该显示错误消息并中止。否则它应该显示上述信息。我一辈子都无法让它运行。这是我所拥有的,请帮忙!:

   #!/bin/csh
   $1
   set file=$1
       if ($file==0)then
             echo "usage: assignment6.sh <directory_name>"
             exit0
       else
           if (-e $file && -r $file) then
                echo "Number of Directories: `ls | wc -w`"
                echo "Number of Files: `ls -d */ | wc -w`"
                echo "Number of Readable files: `find * -type f -or -type d -maxdepth 0 -perm +u=r | wc -w`"
                echo "Number of Writable files: `find * -type f -or -type d -maxdepth 0 -perm +u=w | wc -w`"
                echo "Number of Executable files: `find * -type f -or -type d -maxdepth 0 -perm +u=x | wc -w`"

            else
                if (! -e $file) echo "No such directory."
                exit 0
            endif
       endif
 exit 0

答案1

该脚本中的问题:

  1. 您正在解析 的输出ls不解析ls
  2. 您依赖于文件名不包含空格或换行符。 它们可以包含其中任何一个。
  3. 你正在使用csh.一切都靠它自己,这对于 shell 脚本来说是个坏主意。 Bash、Ksh、Zsh,几乎任何事物但这csh是一个更好的主意。 (我的观点,但请仔细阅读链接的事实推理。)

这是该程序部分的 POSIX 兼容版本。 (如果以后有时间,我可能会包括其余的功能。)

这不会处理文件数量超过参数列表的情况,但可以修改它来执行以下操作:真的必要的。

#!/bin/sh

[ "$#" -eq 1 ] && [ -d "$1" ] || {
  printf 'Usage:\t%s <directory>\n' "$0"
  exit 1
}

dirs="$(find "$1" -path '*/*/*' -prune -o -type d -exec sh -c 'printf %s\\n "$#"' sh {} +)"
files="$(find "$1" -path '*/*/*' -prune -o -type f -exec sh -c 'printf %s\\n "$#"' sh {} +)"

printf 'Number of directories in %s:\t%s\n' "$1" "$dirs"
printf 'Number of files in %s:\t%s\n' "$1" "$files"

由于-maxdepth主设备不可移植,因此我使用了此处描述的技术:

相关内容