ディレクトリとすべてのネストされたファイルのパターンごとにファイルのリストを取得し、結果を繰り返します。

ディレクトリとすべてのネストされたファイルのパターンごとにファイルのリストを取得し、結果を繰り返します。

異なるレベルのネストを含む別のディレクトリを持つ "my_directory"ディレクトリで、パターンごとにいくつかのファイルを見つけて、1つずつリモートサーバーにアップロードしようとしています。リモートサーバーでは、同じサーバーにコピーする必要があります。リモート相対パス my_directory。そのためにscp

私はこれから始めました:

ls -al my_directory | grep "*.my_custom."

含まれているファイルの一部が存在しても*.my_custom.何も返しません。

私がすることができます:

a) いくつかのパターンでこれらのファイルを探します。

b)bashで繰り返し各項目を変数として参照できますか?これで、次の手順でサーバーにアップロードできます。

ベストアンサー1

あなたのアプローチには2つの問題があります。

  1. grepgrep正規表現が必要ですが、呼び出し時にワイルドカード(「ワイルドカード」とも呼ばれます)を使用しています。二人は違う。 globでは*「すべての文字およびすべての長さの文字列」を意味し、正規表現では「0個以上の先行文字」を意味する*か、先行文字がない場合はリテラルを意味します。対照的に、.globではリテラルを意味し.、正規表現では「すべての単一文字」を意味します。したがって、grep文字通りアスタリスクを含むファイルを見つけてから、単一の文字を見つけてから、単一のmy_custom文字を検索し続けます。達成しようとする一致の正規表現は次のとおりです。

    .*\.my_custom\.
    

    または固定していないので、単に

    \.my_custom\.
    
  2. さらなる処理のためにシェルスクリプトで生成されたリストを使用しようとしています。 @Pankiがすでに述べたように解析されない出力lsこれを行うには、特殊文字を含むファイル名を偶然見つけます。幸いなことに、globを使用して元の試みに戻り、シェルから直接ファイルを繰り返すことができます。

    for file in *.my_custom.*
    do
      your_upload_command "$file"
    done
    

    シェル変数は$file二重引用符で囲まれています。これは不要なトークン化が発生しないようにするためです。つまり、シェルスクリプトがファイル名にスペースやその他の特殊文字を誤って見つけないようにするためです。

  3. これを再帰的に実行すると述べたので、次のようにシェルスクリプトを少し変更するだけでこれを行うことができます。globstarシェルオプションの使用、Bash v4から利用可能:

    shopt -s globstar
    for file in **/*.my_custom.*
    do
      your_upload_command "$file"
    done
    

おすすめ記事