特定の順序でファイルを読み取るプログラムがあります。この例では、両方とも同じ拡張子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