ディレクトリを繰り返すときは、エントリがファイルかディレクトリかをテストします。

ディレクトリを繰り返すときは、エントリがファイルかディレクトリかをテストします。

まず、ここに初めて来たので長さが長くてすみません。ただし、フォーラムルールには詳細が必要です。

申し訳ありません。奇妙に印刷されます。

私がしたいことは次のとおりです。 (B)部分で詰まった。

生成したスクリプトは、コード内のすべてのパスに対して相対パスのみを使用する必要があります。スクリプトが〜ディレクトリで実行されていると仮定する必要があります。

(A)「読み取り」組み込みコマンドを使用して、ユーザーが指定したディレクトリ内のすべての項目を繰り返すシェルスクリプトを作成します。スクリプトは入力を検証し、ループを使用して検証が完了した後にのみスクリプトを続行できるようにする必要があります。指定されたディレクトリがディレクトリであることを確認する必要があります。

(B)スクリプトがディレクトリ内のエントリを繰り返すときにエントリをテストして、そのエントリがディレクトリかファイルであるかを確認する必要があります。

  • (B.1)ディレクトリの場合、スクリプトはディレクトリを反復処理し、その中のエントリ数を数える必要があります(再帰的ではありません)。このスクリプトは、ディレクトリ名とその中にあるファイル(およびフォルダ)の数を「~/sorter/directory_listing.txt」というファイルの同じ行に出力する必要があります。

  • (B.2)ファイルの場合は、duと人が読める出力を使用してサイズを確認する必要があります。スクリプトはサイズの後にスペースを入れてから、「~/sorter/files_and_sizes.txt」ファイルの新しい行にファイル名を書き込む必要があります。

(C)ループが完了したら、files_and_sizes.txtファイルを人間が読めるようにソートしてから、~/sorter/files_sorted.txtファイルに出力する必要があります。 Directory_listing.txtファイルは、ファイル数と逆の順序でソートする必要があります。エントリをディレクトリに保存し、~というファイルに出力します。 /sorter/dir_reverse.txt ファイル

私の試み:

read -p "Please enter a directory " chosen_dir

while [[ ! -d "$chosen_dir" ]]
do
 echo Please enter a valid directory && read chosen_dir
done

for i in $chosen_dir/*;

    do
        counter=$((counter+1))
        if [ -d "$chosen_dir" ]; then
            ls "$chosen_dir" | wc -l > sorter/directory_listing.txt
        else
            if [ -f "$chosen_dir" ]; then
                du -sh "$chosen_dir"/* > sorter/files_and_sizes.txt
        fi
    done

結果:

blahblah@vm1:~$ ./taratest.sh
Please enter a directory testsort
./taratest.sh: line 26: syntax error near unexpected token `done'
./taratest.sh: line 26: `    done'

削除するとdoneこんなことが出ますね…

新しい結果:

blahblah@vm1:~$ ./taratest.sh
Please enter a directory testsort
./taratest.sh: line 27: syntax error: unexpected end of file

次に、ディレクトリを繰り返しながら、エントリがbashのファイルかディレクトリかをテストしながらここで検索します。

次のように変更されました。

スクリプトの最初の部分は次のとおりです。

for i in "$chosen_dir"/*

do
    [ -f "$chosen_dir" ] && echo "is File"

    [ -d "$chosen_dir" ] && echo "is Directory"


done

私は出力が指示のものと異なることを知っています。テスト目的でのみエコーすることです。

結果:

Please enter a directory testsort

is Directory

is Directory

is Directory

is Directory

2つはファイル、2つはディレクトリです。なぜ4つのディレクトリと言いますか?

blahblah@vm1:~$ ls -lh testsort
total 8.0K
drwxrwxrwx 2 blahblah student 68 Jun  4 17:41 dir1
drwxrwxrwx 2 blahblah student 68 Jun  4 17:41 dir2
-rwxrwxrwx 1 blahblah student  0 Jun  4 17:41 file1.txt
-rwxrwxrwx 1 blahblah student  0 Jun  4 17:41 file2.txt

ソリューションのご案内をいただきありがとうございます。

ベストアンサー1

問題は、次の構成があることです。

for [stuff]; do
   if [test]; then
       [stuff]
   else
       if [test]; then
          stuff
   fi
done

2つの入れ子になった項目がありますif。大丈夫ですが、そのうちの1つだけを終了できますfi。次のいずれかを実行する必要があります。

# Alternative one:
for [stuff]; do
   if [test]; then
       [stuff]
   else
       if [test]; then
          stuff
       fi
   fi
done

# Alternative two
for [stuff]; do
   if [test]; then
       [stuff]
   elif [test]; then
       stuff
   fi
done

おすすめ記事