.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つのことがあります。
newfile.txt
に渡すファイルのリストに自分自身を含めたくありませんcat
。cat
一部の実装では、入力ファイルがstdoutと同じ場所にある場合、苦情が表示されます。そうしないと、cat
ループから出力ファイルを読み取るかのようにディスクがいっぱいになる可能性があります。ここでリダイレクトを実行すると、globが展開されます。このリダイレクトは、globが拡張されたときにサイズが0になるように出力ファイルを切り捨てます。- に渡された引数のリストから不要なファイルを削除することで、
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
最終的にはチェックを受けることがあります(ここでも同時に実行されるため、起動とスキャンの間にリダイレクトが実行されていない可能性があります)。サイズがあらかじめ存在する場合)。cat
find
newfile.txt
xargs > newfile.txt
find
find
newfile.txt
find
また、隠しファイルはデフォルトでは除外されないため、手動で除外する必要があります。また、GNUの非文字問題もLC_ALL=C
解決する必要があります。find
この場合、xargs
コマンドラインサイズの制限が解決されます。
この方法と同等の方法は次のzsh
とおりです。
-L
⟷-
-type f
⟷.
-size +0
⟷L+0
sort -V
⟷n
答え3
従来のUNIXファイルシステムと同様に、空のファイルを読み取るオーバーヘッドは、ファイルが空であることを検出するオーバーヘッドとほぼ同じですcat
。
また、ファイルが順番にあるべきかどうかについても言及していません。そうでなければ(おそらくfindはここで順序を保存するかもしれません)、これは次のものより良いかもしれません。https://unix.stackexchange.com/a/633734/320598:
(find *.txt \! -size 0 | xargs cat) >newfile.txt