空のファイルを除いてファイルをリンクする方法は?

空のファイルを除いてファイルをリンクする方法は?

.txt多くのファイルを一緒に貼り付ける必要があります。私は次のコマンドを使用します。

cat *.txt > newfile.txt 

一部のファイルが空であることがわかりました。catこれらの空のファイルで機能しないようにスクリプトにコントロールを挿入するにはどうすればよいですか?

ありがとうございます。

答え1

必ずしも必要ではありませんが、空のファイルを除外する必要がある場合:

for i in *.txt; do [ "$i" != newfile.txt ] && [ -s "$i" ] && cat -- "$i"; done >newfile.txt

-s指定されたファイルが存在し、空でない場合、テストは真です(これは標準テストです。参照)man test。また、出力ファイル自体を処理しません。

答え2

では、glob修飾子をzsh使用できます。L+0

(cat -- *.txt(n-.L+0)) > newfile.txt

(ここでも限定的に定期的なシンボリックリンク解析()後にファイル(.)のみが決定(およびサイズ)され、-ファイルリストは次のように数字(n)でソートされます。file10.txt後ろに file9.txt例えば)。

通常、空のファイルは出力を生成しないため、空のファイルを含めても効果はありませんcat。しかし、これを良い考えにする2つのことがあります。

  1. newfile.txtに渡すファイルのリストに自分自身を含めたくありませんcatcat一部の実装では、入力ファイルがstdoutと同じ場所にある場合、苦情が表示されます。そうしないと、catループから出力ファイルを読み取るかのようにディスクがいっぱいになる可能性があります。ここでリダイレクトを実行すると、globが展開されます。このリダイレクトは、globが拡張されたときにサイズが0になるように出力ファイルを切り捨てます。
  2. に渡された引数のリストから不要なファイルを削除することで、catコマンドラインを短くしてサイズ制限に達する可能性を減らします。ただし、ここではzsh「」を使用してこの問題を解決することもできますzargs

いいえzsh。ただし、GNUユーティリティがある場合は、次のことができます。

 LC_ALL=C find -L . -maxdepth 1 -name '*.txt' ! -name '.*' \
                    ! -name newfile.txt -type f -size +0 -print0 |
   sort -V0 |
   xargs -r0 cat > newfile.txt

-size +0ここでは、現在ディレクトリに多くのファイルがあるように信頼できません。xargs最終的にはチェックを受けることがあります(ここでも同時に実行されるため、起動とスキャンの間にリダイレクトが実行されていない可能性があります)。サイズがあらかじめ存在する場合)。catfindnewfile.txtxargs > newfile.txtfindfindnewfile.txt

findまた、隠しファイルはデフォルトでは除外されないため、手動で除外する必要があります。また、GNUの非文字問題もLC_ALL=C解決する必要があります。findこの場合、xargsコマンドラインサイズの制限が解決されます。

この方法と同等の方法は次のzshとおりです。

  • -L-
  • -type f.
  • -size +0L+0
  • sort -Vn

答え3

従来のUNIXファイルシステムと同様に、空のファイルを読み取るオーバーヘッドは、ファイルが空であることを検出するオーバーヘッドとほぼ同じですcat

また、ファイルが順番にあるべきかどうかについても言及していません。そうでなければ(おそらくfindはここで順序を保存するかもしれません)、これは次のものより良いかもしれません。https://unix.stackexchange.com/a/633734/320598:

(find *.txt \! -size 0 | xargs cat) >newfile.txt

関連情報