異なるレベルのネストを含む別のディレクトリを持つ "my_directory"ディレクトリで、パターンごとにいくつかのファイルを見つけて、1つずつリモートサーバーにアップロードしようとしています。リモートサーバーでは、同じサーバーにコピーする必要があります。リモート相対パス my_directory
。そのためにscp
私はこれから始めました:
ls -al my_directory | grep "*.my_custom."
含まれているファイルの一部が存在しても*.my_custom.
何も返しません。
私がすることができます:
a) いくつかのパターンでこれらのファイルを探します。
b)bashで繰り返し各項目を変数として参照できますか?これで、次の手順でサーバーにアップロードできます。
ベストアンサー1
あなたのアプローチには2つの問題があります。
grep
grep
正規表現が必要ですが、呼び出し時にワイルドカード(「ワイルドカード」とも呼ばれます)を使用しています。二人は違う。 globでは*
「すべての文字およびすべての長さの文字列」を意味し、正規表現では「0個以上の先行文字」を意味する*
か、先行文字がない場合はリテラルを意味します。対照的に、.
globではリテラルを意味し.
、正規表現では「すべての単一文字」を意味します。したがって、grep
文字通りアスタリスクを含むファイルを見つけてから、単一の文字を見つけてから、単一のmy_custom
文字を検索し続けます。達成しようとする一致の正規表現は次のとおりです。.*\.my_custom\.
または固定していないので、単に
\.my_custom\.
さらなる処理のためにシェルスクリプトで生成されたリストを使用しようとしています。 @Pankiがすでに述べたように解析されない出力
ls
これを行うには、特殊文字を含むファイル名を偶然見つけます。幸いなことに、globを使用して元の試みに戻り、シェルから直接ファイルを繰り返すことができます。for file in *.my_custom.* do your_upload_command "$file" done
シェル変数は
$file
二重引用符で囲まれています。これは不要なトークン化が発生しないようにするためです。つまり、シェルスクリプトがファイル名にスペースやその他の特殊文字を誤って見つけないようにするためです。これを再帰的に実行すると述べたので、次のようにシェルスクリプトを少し変更するだけでこれを行うことができます。
globstar
シェルオプションの使用、Bash v4から利用可能:shopt -s globstar for file in **/*.my_custom.* do your_upload_command "$file" done