多くのファイルでlsを使用すると、「bash:引数リストが長すぎます」というエラーが発生します。

多くのファイルでlsを使用すると、「bash:引数リストが長すぎます」というエラーが発生します。

以下を使用して、フォルダ内の.fitsファイルのすべての名前を入力しようとします。

ls *.fits > output_all.txt

フォルダ内の.fitsファイルの数が> 330,000で、エラーメッセージが表示されます。

bash: /usr/bin/ls: Argument list too long

この問題をどのように解決できますか?

または、ファイルを完全に生成する必要はありませんoutput_all.txt。私はただ話す必要があります。竹馬このコマンドを使用して、どの.fitsファイルを1つの大きな.fitsファイルにマージしますか?

stilts tcat in=@output_all.txt out=table_stilts.fits icmd='keepcols "FLUX LOGLAM"'

ファイルの代わりにディレクトリを入力として受け入れるようにSTILTSに指示する方法を知っていれば、私の問題は解決しますls。総窒素

ベストアンサー1

で、シェルは、ls *.fitsで終わるか開始しないファイル名を見つけるためにすべての難しい作業を行います。.fits.

その後、そのリストをに渡しますls。これはそれを並べ替えます(やはり、シェルグロブがリストを渡す前に並べ替えたのでls)、後で表示します(実装と転送の有無によって列または行ごとに1つずつ)。端末へ)各ファイルが存在することを確認してください。

したがって、これは特に次の点を考慮するとわずかに非生産的です。

  • --オプションの区切り文字を忘れたため、ファイル名で始めると-問題が発生します。
  • オプションを忘れた-dため、ファイルがディレクトリタイプの場合は、ファイルls自体の代わりにその内容が一覧表示されます。
  • シェル(を含むほとんどのシェルでは)とは別のlsコマンドなので、最終的にはシステムコールを使用して別のプロセスで実行する必要があり、最終的に引数と環境変数の累積サイズの制限を超えます。bashexecve()

shellによって生成されたリストを印刷する必要がある場合は、ほとんどのシェルに組み込まれたリストを*.fits使用できますprintf(したがって呼び出されず、execve()制限があります)。

printf '%s\n' *.fits > output_all.txt

しかし、これは次の質問を残します。

一致するファイルがない場合は、シェル*.fitsにそのまま残り、最終的に印刷されます。bash*.fitsprintf*.fits<newline>

ls存在しない*.fitsファイルに関するエラーメッセージを表示して空白のままにしますoutput_all.txt

nullglobこれはオプション(bashからbashコピーzsh)を介して変更することができ、これにより*.fits拡張が空になります。しかし、別の問題に直面することになります。型を除いてパラメータが渡されない場合は、空のパラメータが渡されたかのprintfように型がまだ一度検索されますoutput_all.txt

この問題は次の方法で解決できます。

shopt -s nullglob
println() {
  [ "$#" -eq 0 ] || printf '%s\n' "$@"
}
println *.fits > output_all.txt

zsh代わりに、次に切り替えるとbash簡単になります。

print -rC1 -- *.fits(N) > output_all.txt

ここでglobをN有効にし、対応する引数awをnullglobolumnに印刷します。ここで重要なのは、引数が渡されなければ何も印刷されないことです。print -rC1r1 C

を使用すると、zshglob修飾子(例:.*.fits(N.)D*.fits(ND.)


最後に、ファイルの検索をいつでも遅らせることができますが、findリストを並べ替えて隠しファイルを除いてプレフィックスを避ける必要がある場合は、./この作業もすぐに退屈になり、GNU拡張が必要です。たとえば、次のようになりますprint -rC1 -- *.fits(N.)

LC_ALL=C find . -maxdepth 1 ! -name '.*' -type f -printf '%P\0' |
  sort -z | tr '\0' '\n' > output_all.txt

おすすめ記事