だから私はこれらのファイルシステム構造を持っています。
/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
ls
bashや配列を持つ他のシェルにはありません。 (名前に面白い文字が含まれていても機能します):
$ 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
シェルは、/my.parent/my.folder*
名前がアルファベット順で始まるサブディレクトリのリストに展開されます。呼んでも役に立ちません。/my.parent
my.folder
ls
リストの最後の要素を選択するには、シェルに配列がある場合は、リストを配列に配置して最後の要素を選択します。
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つ以上あると想定しています。