ディレクトリ入力を含むシェルスクリプト

ディレクトリ入力を含むシェルスクリプト

私は1つの引数(ディレクトリ名)を受け入れ、そのディレクトリ内のファイル、ディレクトリ、読み取り可能ファイル、書き込み可能ファイル、および実行可能ファイルの数を示すシェルスクリプトを作成しています。引数なしで実行すると、エラーメッセージが表示され、中止されます。また、指定されたパラメーターが存在しない場合は、エラーメッセージを表示して中断する必要があります。それ以外の場合は、上記の情報を表示する必要があります。私は生涯にわたってそれを動作させることはできません。これが私が持っているものです。助けてください! :

   #!/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すべてを自分で使用しています。これはシェルスクリプトにとって悪い考えです。 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基本的なデバイスはポータブルではないため、ここで説明した技術を使用しました。

関連情報