ls/find/etcを使用して最後のフォルダ(アルファベットの降順と一致パターン)を取得するには?

ls/find/etcを使用して最後のフォルダ(アルファベットの降順と一致パターン)を取得するには?

だから私はこれらのファイルシステム構造を持っています。

/my.parent
  -> my.folder1
     -> my-file1.txt
  -> my.folder2
     -> my-file2.txt
  -> another-folder-here
     -> another-file.txt

次の一連のコマンドを使用します。

ls -r /my.parent/my.folder* | head -n 1 | rev | cut -c 2- | rev

私が望むmy.folder2のフルパスを返します。私の問題は、1つのフォルダだけがパターンと一致する場合(例:my.folder1の削除/移動)、フルパスを取得するのではなく、my.folder2のコンテンツリストを取得することです。

すべてのケースで動作するように修正する方法についてのアイデアはありますか?ありがとうございます。

答え1

ls内容を一覧表示する代わりにフォルダ名を表示するには、対応するパラメータ-dを使用します。例:

ls -ld ~

答え2

lsbashや配列を持つ他のシェルにはありません。 (名前に面白い文字が含まれていても機能します):

$ names=( my.parent/my.folder* ); echo ${names[-1]}
my.parent/my.folder2

配列がない場合(興味深い文字にはあまり強力ではありませんが、分岐を保存しますls):

$ printf "%s\n" my.parent/my.folder*  | tail -1
my.parent/my.folder2

答え3

出力を解析しません。ls

シェルは、/my.parent/my.folder*名前がアルファベット順で始まるサブディレクトリのリストに展開されます。呼んでも役に立ちません。/my.parentmy.folderls

リストの最後の要素を選択するには、シェルに配列がある場合は、リストを配列に配置して最後の要素を選択します。

directories=(/my.parent/my.folder*)
last_directory="${directories[${#directories}-1]}"

シェルに配列がない場合は、位置引数を使用してこれを実行できます。

set -- /my.parent/my.folder*
eval "last_directory=\${$#}"

これにより、現在の位置パラメータが上書きされます。これを防ぐには、関数を使用してください。

set_to_last () {
  eval "$1=\${$#}"
}
set_to_last last_directory /my.parent/my.folder*

この回答のすべてのコードは、一致する項目が1つ以上あると想定しています。

関連情報