#!/bin/bash
シェバング:それはのような変数を二重引用符を投げるようにするとよいでしょう。このスクリプトが./this_scriptのように直接起動されるか、PATHに見つかった場合は、/bin/bash
で起動されます。
outputFile=$1
outputFile
に最初の引数を割り当てます。
++ find -name '*txt'
「txt」で終わる名前のすべてのファイルを再帰的にリストします。パスを含めてfind . -name '*.txt'
と書くのがより標準的です。
+ … | grep data
前のファイル名のリストをフィルタリングします。名前に文字列 "data"を含むものだけをリストします。このパイプは、find . -name '*data*txt'
と書くことで取り除くことができます。 find | grep
パイプラインの出力におけるすべての単語については
for file in $(find -name '*txt' | grep data)
、名前file
にその単語を割り当て、ループを実行します。見つかった名前の中に空白やグロブ文字が含まれていると、これは分解することができます。これを処理するには、find
のネイティブ-exec
フラグを使用する方が良いでしょう。
echo $file >> $outputFile
$outputFile
を拡大したパスで、新規または既存のファイルへの変数「ファイル」の拡張を追加します。前者の拡張がダッシュで始まっている場合、echo
はそれを引数として扱う可能性があります。後者の展開に空白またはグロブ文字が含まれていると、 "あいまいなリダイレクト"エラーが発生する可能性があります。展開を引用すると良いでしょう。printf
を使用して、printf '%s\n' "$file" >> "$outputFile"
のように、引数の大文字小文字をecho
にしないようにしてください。
cat $file >> $outputFile
$outputFile
を展開したパスに、変数「ファイル」の展開で見つかったファイルの内容を追加、または別のあいまいなリダイレクトエラーを引き起こします。 cat "$file" >> "$outputFile"
のような拡張を引用する方が良いでしょう。前述の拡張エッジ例どれもが予想しなかった、このように、この全体のスクリプトを記述する方が良いだろうと仮定すると
:それだけでファイルを兼ね備えよう
find . -name '*data*txt' -print -exec cat {} \; >> "$1"
が見えます。 –
これは、ファイル名に空白が含まれているファイルを結合します。私はこのコードがあなたのコースインストラクターによって書かれていないことを願っています。 – John1024
http://explainshell.com/ – Cyrus