まず、ここに初めて来たので長さが長くてすみません。ただし、フォーラムルールには詳細が必要です。
申し訳ありません。奇妙に印刷されます。
私がしたいことは次のとおりです。 (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
答え2
もう1つの問題は、テスト変数を使用するときに変数を(正しく)参照しますが、ループでは参照できないこと-d
です。for
変える:
for i in $chosen_dir/*;
do
使用:
for f in "$chosen_dir"/*; do
(名前の変更とスペースの変更はスタイルポイントです。追加された二重引用符が重要です。)
カウンターを実際に使ったことがないので、カウンターで何をしたいのかわかりません。また、上記の$i
構成$f
に基づいてfor
。"$chosen_dir"
さて、これを宿題に指定していただきありがとうございます。より短い解決策があるかもしれませんが、構文エラーを修正して問題ない場合は、一般的なアプローチは問題ありません。変数参照。
サブディレクトリのファイル数の場合、使用するコマンドで正確な数が得られないことがあります。 (実際にはそうでしょう。いいえ正確な数を得るには、コマンドを使用します。ls "$chosen_dir" | wc -l
これは、サブディレクトリではなく、ユーザーが入力したディレクトリをテストするためです。 )サブディレクトリ内の正確なファイル数を提供できるように、linecountのls
代わりに使用を検討することができます。ls -1 -A "$i"
(およびフラグman ls
の詳細については、参考資料を参照してください。)-1
-A
これはまだ改行文字を含むファイル名を正しく処理しませんが、宿題のスコアを失うことは非常に疑わしいです。 (実際に本番で使用されるスクリプトの多くは、改行文字を含むファイル名でも失敗します。これらの名前は、ほぼ完全に悪意のあるユーザーからのものです。)
C部分は自分で把握できると思います。 ;)(このサイトでタグを検索して必要かどうかを確認するman sort
こともできます。)sort