変数の中にスペースがあるディレクトリパスを使用して、ディレクトリ内のすべてのファイルをどのようにキャプチャできますか?

変数の中にスペースがあるディレクトリパスを使用して、ディレクトリ内のすべてのファイルをどのようにキャプチャできますか?

folder1スペースを含むパス変数があります。

TEST=path/with\ space/to/folder1/

すべてのファイルをリンクしたいがエラーが発生しますfolder1cat

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回数で実行されます)。制限はfindcatARG_MAX、これは最新のLinuxシステムでは約200万バイトの価値があります。

使用することもできます\;。これは+、各ファイル名を一度find実行するように指示しますcat(したがって、速度がはるかに遅くなりますが、時には一度に1つのファイル名で実行する必要があります。他の場合は、一括実行するのが正しいこと+です)。

おすすめ記事