folder1
スペースを含むパス変数があります。
TEST=path/with\ space/to/folder1/
すべてのファイルをリンクしたいがエラーが発生しますfolder1
。cat
cat "$TEST"* > test
cat: path/with: No such file or directory
cat: 'space/to/folder1/*': No such file or directory
これを自分で試してみるとうまくcat path/with\ space/to/folder1/ > test
いきます。
また、二重引用符を使用することもできます。
TEST="path/with space/to/folder1/"
cat "$TEST" > total
しかし、パスを使ってこれを正しく実行するには\
?
ベストアンサー1
find
私はこれにそのオプションを使用します。-exec
たとえば、
TEST='path/with space/to/folder1/'
find "$TEST" -maxdepth 1 -type f -exec cat {} + > test
この-maxdepth 1
オプションは、「$ TEST」の下のサブディレクトリへの再帰を防ぎます。必要に応じて変更または削除できます。 -type f
通常のファイルのみが一致します(たとえば、ディレクトリ、名前付きパイプ、シンボリックリンクなどを除く)。
特定のファイル名パターンと一致させるには、-name
オプション-regex
を-name '*.txt'
使用するか、大文字と小文字を区別しない-iname
/を使用できます-iregex
。
find
より多くのオプションがあり、非常に柔軟ですが、非常に複雑で、すべての機能を学ぶには時間と労力が必要です。しかし、努力する価値があります。マニュアルページを読んで練習してみてください:-)
1つの注目すべき点は、find
基本的には述部が一緒にANDで連結されることです。つまり、ファイルがある場合は、-name '*.txt' -name '*.csv'
.txtと.csvで終わるすべてのファイルを一致させようとします(これは不可能なので、何も一致しません)。 OR述語を使用するには、次のことが必要です。
find "$TEST" -maxdepth 1 -type f \( -name '*.txt' -o -name '*.csv' \) \
-exec cat {} + > test
これは、.txt または .csv で終わるファイルと一致します。 OR演算の述語は、演算と同様に括弧内に入れてグループ化されます。完全な行は、「$ TESTディレクトリで最大深さ1の通常のファイルと(.txtまたは.csvで終わる名前)を探し、それをキャットします。出力をtestというファイルにリダイレクトします」と読みます。
また、注目に値するのはoptions{}
のファイル名のプレースホルダーです-exec
。+
最後のオプションは、各コマンドラインにできるだけ多くのファイル名を合わせるように指示します(できるだけ少ない-exec
回数で実行されます)。制限はfind
cat
ARG_MAX、これは最新のLinuxシステムでは約200万バイトの価値があります。
使用することもできます\;
。これは+
、各ファイル名を一度find
実行するように指示しますcat
(したがって、速度がはるかに遅くなりますが、時には一度に1つのファイル名で実行する必要があります。他の場合は、一括実行するのが正しいこと+
です)。