こんにちは。私はこのループで最長のファイル名と最短のファイル名を取得しようとしています。 awkパイプを試しましたが、うまくいきません。常にファイル名の文字列数を使用してすべてのファイルを書き込みます。配列を繰り返して、最も短いファイル名と最長のインデックスを記録するには、そのパスで最も長く最も短いスクリプトファイル名を確認する必要があります。 dirs配列にはファイル名のみをソートする必要がありますが、出力は次のようになります。最長ファイル名 = 15 文字 /usr/sbin/update-info-dir
今動作します。最長ファイル名 = 3 文字 /usr/sbin/ufw
最大ファイル名 = 22 文字 /usr/sbin/update-ca-certificates
最大ファイル名 = 15 文字 /usr/sbin/update-info-dir
最長ファイル名 = 16 文字 /usr/sbin/update-initramfs
最長ファイル名 = 13 文字 /usr/sbin/update-locale
最長ファイル名 = 11 文字 /usr/sbin/update-mime.... そして、以下のように配列に保存されているすべてのファイルを検索します。上記と同じパスを持つ最長ファイルと最短ファイルのみを表示したいと思います。
ベストアンサー1
この記事を書いている時点では、スクリプトの要件は比較的不明です。
配列を使用し、ファイル名とパスの長さに基づいてソートする必要があることを知っています。
このスクリプトレットはまさにそのようなことをしますが、あなたの例を見れば、特別に配列を繰り返すのか、それとも別の方法で配列を構成するのかを100%確信できません。また、お客様のご使用がわかりませんので、$PATH
今は省略させていただきます。
files=( $(find . -type f | awk '{ print length, $0 }' | sort -n -s | cut -d' ' -f2-) )
echo "shortest: ${files[0]}"
echo "longest: ${files[-1]}"
このスクリプトレットには、少なくともBashバージョン4.2(配列の負のインデックス作成用)が必要です。最初の引数で指定した現在のディレクトリを検索しますfind
。
ループを使用する必要がある場合は、配列を並べ替えるのではなく、配列を繰り返しながら最短インデックスと最長インデックスを記録できます。これが要件であるかどうかは不明です。配列を繰り返しながらこれを行うことはあまり意味がないので、必ずしも必要でない限りお勧めしません。