引数でファイルの一致順序を逆に置き換えます。

引数でファイルの一致順序を逆に置き換えます。

特定の順序でファイルを読み取るプログラムがあります。この例では、両方とも同じ拡張子txtを持ちます。

{program_name} {input 1...} {output}

出力ファイル名を「a.txt」と指定したため、これを呼び出すと最初の結果になりました。lsこれはこのコマンドのファイル入力順序を示しています。

{program_name} *.txt

最初の結果が最後の結果として現れることを望みます。スターマッチングの順序を変更するには?パイプを使用する必要がある場合、特殊文字またはスペースが正しく引用されるようにパラメータを正しく入力する構文は何ですか?

ベストアンサー1

使用zsh:

zsh -c 'program *.txt(.^on)'

はパターンの修飾子な(.^on)ので、通常のファイル()とのみ一致し、結果のリストは逆順()でソート()されます。zsh*.txt.o^n

これにより、生成されたファイル名のリストをコマンドライン引数として使用して実行される非対話型zshシェルが起動します。programこのコマンドは、ファイル名にスペースや改行などが含まれている場合でも、リバース引数のリストを正しく処理します。

例:

$ touch {a..d}.txt
$ echo *.txt
a.txt b.txt c.txt d.txt
$ zsh -c 'echo *.txt(.^on)'
d.txt c.txt b.txt a.txt

zshソリューション:

set --
for fname in *.txt; do
    set -- "$fname" "$@"
done

program "$@"

または、たとえば名前付き配列を使用しますbash

args=()
for fname in *.txt; do
    args=( "$fname" "${args[@]}" )
done

program "${args[@]}"

どちらのコードスニペットも、*.txtパターンに一致する名前に基づいて配列を構築します。各名前は配列の前にプッシュされるため、配列は姓の最初に終了する効果があります。

最初のケースでは、位置引数のリストを配列として使用します。このコードはsh同様のシェルで動作するはずです。


プログラムの引数リストで最後の名前だけが必要で、拡張順に異なる名前を持つことができる場合は、次のコードが同様のシェルshでトリックを実行します。

set -- *.txt
fname=$1
shift
program "$@" "$fname"

または、bash特定の構文と名前付き配列を使用して

args=( *.txt )
program "${args[@]:1}" "${args[0]}"

"${args[@]:1}"elementで始まるargs配列のすべての要素(個別に引用)に展開されます1

もう一度テストしてくださいecho

$ args=( *.txt )
$ echo "${args[@]:1}" "${args[0]}"
b.txt c.txt d.txt a.txt

おすすめ記事