私は次のことをしようとしています:
glob パターンに一致するリモートファイルのリストを取得します。
existing_files=$(ssh [email protected] "ls pattern*")
パターンに一致する新しいファイルを追加します。
scp pattern_matching_file [email protected]:
これで、新しく作成されたファイルを削除せずにその中のファイルを削除したいのですが、$existing_file
方法がわかりません。
答え1
あなたは
scp pattern_matching_file [email protected]:
その後、そのディレクトリ内のすべてのファイルを削除したいと思います。とは別に転送したばかりのアイテムです。以下は2つの提案です。
コピーする前にすべてのファイルを削除してください。
ssh -qn [email protected] 'find -maxdepth 1 -type f -name '*pattern*' -delete'
コピーしたファイル以外のファイルを削除してください。
ssh -qn [email protected] 'find -maxdepth 1 -type f \( -name 'keep_this_file' -o -name '*pattern*' -delete \)'
-name '*pattern*'
どちらの場合も、実際の宛先パスに応じて、指定されたディレクトリ(ドットファイルを含む)のすべての内容を削除することを省略できます。このコマンドはfind
単純化されたシェルグローブモードにあるため、提供した元のコマンドを使用する必要があります。-name
pattern
ls
それを適用する前に理論をテストする-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