SSH経由でファイルリストを削除する

SSH経由でファイルリストを削除する

私は次のことをしようとしています:

glob パターンに一致するリモートファイルのリストを取得します。

existing_files=$(ssh [email protected] "ls pattern*")

パターンに一致する新しいファイルを追加します。

scp pattern_matching_file [email protected]:

これで、新しく作成されたファイルを削除せずにその中のファイルを削除したいのですが、$existing_file方法がわかりません。

ベストアンサー1

あなたは

scp pattern_matching_file [email protected]:

その後、そのディレクトリ内のすべてのファイルを削除したいと思います。とは別に転送したばかりのアイテムです。以下は2つの提案です。

  1. コピーする前にすべてのファイルを削除してください。

    ssh -qn [email protected] 'find -maxdepth 1 -type f -name '*pattern*' -delete'
    
  2. コピーしたファイル以外のファイルを削除してください。

    ssh -qn [email protected] 'find -maxdepth 1 -type f \( -name 'keep_this_file' -o -name '*pattern*' -delete \)'
    

-name '*pattern*'どちらの場合も、実際の宛先パスに応じて、指定されたディレクトリ(ドットファイルを含む)のすべての内容を削除することを省略できます。このコマンドはfind単純化されたシェルグローブモードにあるため、提供した元のコマンドを使用する必要があります。-namepatternls

それを適用する前に理論をテストする-deleteことに置き換えてください。-print


特定のパターンに一致するファイルのリストを検索するには使用できますが、ls {pattern}この方法も一致するディレクトリにドロップダウンします。この-dフラグを使用するとこれを防ぐことができますが、ファイル名に改行文字が含まれている場合でも問題が発生します\n。特に、後でファイルを削除するためにリストを使用したい場合。

代わりに、次のようなファイル配列を作成できます。

files=()
while IFS= read -r -d '' file
do
    files+=("$file")
done < <( ssh -qn [email protected] find -maxdepth 1 -name '*pattern*' -print0 )

# Show what we caught
for file in "${files[@]}"; do echo ">$file<"; done

おすすめ記事