ディレクトリが存在することを確認し、ディレクトリファイルの数を比較するスクリプト

ディレクトリが存在することを確認し、ディレクトリファイルの数を比較するスクリプト

私はUnixとスクリプトに初めてアクセスし、ユーザーから入力ディレクトリを取得して存在することを確認し、指定されたディレクトリ内のファイル数を現在のディレクトリと比較し、その内容を報告するスクリプトを作成しようとしています。それはより多くの文書です。サブディレクトリを入力する限り、私のコードはほとんど機能します。スクリプトを使用して別のブランチに親または他の子を入力しようとすると、フルパスが与えられてもディレクトリが見つかりません。 testコマンドについて同様の質問が提起されていることを知っていますが、テストに実際に存在するディレクトリを認識しないときに実行する操作を説明する項目はありません。

dir1=$(pwd)
read -rp "Input the path..." dir2
    if [ ! -d "$dir2" ]; then
    echo "...does not exist"
    else
    ...

...残りのコードはうまくいきます。ここに問題があります。

編集:一般的なアイデアは別のディレクトリからディレクトリを見つけることですが、それは起こりません。たとえば、 ~/public_html のパスワードでスクリプトを実行して ~/schoolwork と入力すると、フルパスであってもディレクトリを認識できません。

また、ここに公開されたメソッドだけでなく、ロジック(私の関数が存在するかどうかを確認し、それを実行し、そうでなければエラーを返すように)を逆にしました。結果は同じです。

ベストアンサー1

あなたが経験している問題はチルダ拡張です。~/schoolworkスクリプトプロンプトに入力すると、最初のチルダは別の文字にすぎず、テストするときにホームディレクトリへのパスには拡張されません[ ! -d "$dir2" ]。同様に、$HOME/schoolwork変数は$HOME拡張されていないため入力できません。

一般に、ユーザーにパス名の入力を求めるメッセージは表示されません。スクリプトまたはプログラムが実行される前に、チルダと変数が展開されるコマンドラインにパス名を入力する方がはるかに簡単です。また、コマンドラインにパス名を指定すると、ユーザーはタブの完成を使用できるため、タイプミスのリスクが軽減されます。

したがって、ユーザーはスクリプトを使用したいと思います。

./script.sh path/to/some/directory

例えば、

./script.sh ~/schoolwork

ここでは、シェルはパスを拡張しますスクリプトを呼び出す前に、スクリプトは/home/turfer/schoolwork最初の唯一のパラメータとしてパスを取得します。

それでは、このスクリプトをどのように書いていますか?

始めるための提案は次のとおりです。

#!/bin/bash

userdir=$1  # the directory pathname passed on the command line

if [ ! -d "$userdir" ]; then
    printf 'Your directory, %s, does not exist\n' "$userdir" >&2
    exit 1
fi

現在のディレクトリを計算する必要があります$userdirあらゆる種類のファイル(ソケット、シンボリックリンク、目次など。 )。

shopt -s dotglob   # also match hidden names

herefiles=( ./* )
therefiles=( "$userdir"/* )

ただ計算したい場合一般ファイル、2つのパターンが一致するものを繰り返し、テストに合格したものだけを考慮します[ -f ... ](ただし、通常のファイルへのシンボリックリンクはまだ計算されます)。

これで、現在のディレクトリと、ユーザーが指定したディレクトリ内のすべての名前の2つの配列があります。今、私たちはこの配列の長さを比較し、どちらが最も長いかを言わなければなりません。

if [ "${#herefiles[@]}" -gt "${#therefiles[@]}" ]; then
    printf 'There are more files here than in %s\n' "$userdir"
elif [ "${#herefiles[@]}" -lt "${#therefiles[@]}" ]; then
    printf 'There are more files in %s than in here\n' "$userdir"
else
    printf 'There are an equal number of files here as in %s\n' "$userdir"
fi

明らかに、ファイル名を2つの別々の配列に手動で保存することもできます。計算両方のループの名前です。

おすすめ記事