Bagaimana menghapus banyak file menggunakan sftp

12

Posting ini adalah tentang menghapus file muliple dari server jauh, ketika koneksi sftp kata sandi kurang diatur. Saya memiliki kode seperti di bawah ini. Hanya file pertama dalam variabel yang $file_listdihapus, ketika saya menetapkan variabel sebagai,

$file_list="file1 file2"

sftp $USER@$HOST
rm $file_list
quit
SFTP-Session

Saya bahkan mencoba menjalankan perintah dalam mode cepat.

sftp $USER@$HOST
rm file1 file2

Namun, saya masih melihat bahwa hanya file1 yang dihapus.

Saya tidak yakin apakah saya kehilangan perintah dasar. Saya mencoba mdelete/ mdel/ mrm, yang ditolak sebagai perintah tidak valid di jendela prompt sftp.

bhawna
sumber

Jawaban:

8

Berikut adalah salah satu solusi yang mungkin dapat ditambahkan ke skrip bash. Ini tidak ideal karena akan membuat koneksi baru untuk setiap file.

#!/bin/bash
# set variables
USER="username"
HOST="hostname"
file_list="file1 file1 file3 file4"
# delete each file
for file in $file_list; do
    echo "rm $file" | sftp $USER@$HOST
done
exit 0

One-liner ini jauh lebih baik! file1-9 menjadi nama file untuk dihapus, gunakan variabel jika Anda suka, itu adalah hal yang sama.

for file in file1 file2 file3 file4 file5 file6 file7 file8 file9; do echo -e "rm $file" >> sftp_batch; done; sftp -b sftp_batch username@hostname; rm sftp_batch
mbiber
sumber
Bagaimana jika file memiliki spasi putih dalam namanya? Akankah solusi ini berhasil?
codeforester
Anda dapat mengutip nama file. Jika Anda memiliki banyak dari mereka saya sarankan Anda melihat ekspansi parameter bash untuk mendapatkan hasil terbaik. Secara umum untuk kesederhanaan admin tidak akan mengizinkan nama file dengan spasi putih dan karakter terkait.
mbiber
1

Anda tidak dapat memberikan daftar ke rmperintah di sftp, hanya mengambil satu jalur seperti yang tertulis di halaman manual:

rm path
    Delete remote file specified by path.
user90256
sumber
1

Biasanya saya gunakan lftpuntuk melakukan ini.

Pengaturan - pada skin server rmeote
$ mkdir adir
$ touch afile1 afile2
$ ls
afile1  afile2
sekarang kita hapus
$ file_list="afile1 afile2"
$ lftp sftp://sam@skinner -e "cd ~/adir; mrm $file_list"
cd ok, cwd=/home/sam/adir    
rm ok, 2 files removed                 
lftp sam@skinner:~/adir> ls
drwxr-xr-x    2 sam      users        4096 Nov  4 11:52 .
drwxr-x---  131 sam      users       20480 Nov  4 11:51 ..
lftp sam@skinner:~/adir> bye

Untuk menjadikannya perintah tunggal:

$ lftp sftp://sam@skinner -e "cd ~/adir; mrm $file_list; bye"
slm
sumber
Saya tidak dapat menjalankan perintah lftp, mungkin itu memerlukan beberapa file library.
bhawna
@ Bhawna - mungkin tidak diinstal.
slm
1

Jika Anda dapat sftp, tidak bisakah Anda menjalankan ssh? Jika demikian maka perintah seperti:

 ssh user@hostname rm file1 file2 

harus bekerja dengan baik. Jika Anda menggunakan kunci SSH publik / pribadi tidak akan ada prompt kata sandi.

mdpc
sumber
Ya itu berhasil, tetapi perintah di atas tidak membuat informasi log, dan persyaratannya adalah untuk membuat log juga (Meskipun saya tidak menentukannya dalam pertanyaan). Terima kasih
bhawna
1

Jika itu adalah nama file. Anda dapat menghapusnya menggunakan pola glob dengan

rm file*
Philip Rego
sumber
Yah, itu pasti bukan aku.
Kusalananda
Saya sudah mencoba metode ini dan berfungsi jika Anda menggunakan SFTP untuk mengakses server jauh Anda.
MrMauricioLeite