Як видалити кілька файлів за допомогою sftp


13

У цьому дописі йдеться про видалення багаторазових файлів з віддаленого сервера, коли налаштування пароля sftp не встановлюється. Я маю код, як показано нижче. Видаляється лише перший файл змінної $file_list, коли в мене змінна встановлена ​​як,

$file_list="file1 file2"

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

Я навіть намагався виконувати команди в режимі швидкого доступу.

sftp $USER@$HOST
rm file1 file2

Однак я все ще бачу, що видаляється лише файл1.

Я не впевнений, чи пропускаю я якусь основну команду. Я спробував mdelete/ mdel/ mrm, які були відхилені як Недійсна команда у вікні запиту sftp.

Відповіді:


8

Ось одне можливе рішення, яке можна додати до скрипту bash. Це не ідеально, оскільки це створить нове з'єднання для кожного файлу.

#!/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

Цей одноводковий набагато кращий! file1-9 - це імена файлів для видалення; використовуйте змінну, якщо хочете, це те саме.

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

Що робити, якщо у файлах є білі пробіли у своєму імені? Чи буде це рішення спрацювати?
codeforester

Ви можете цитувати назви файлів. Якщо у вас їх багато, я пропоную розглянути розширення параметрів bash, щоб отримати найкращі результати. Зазвичай для простоти адміністратор не дозволить назви файлів з пробілами та пов’язаними символами.
mbiber

1

Ви не можете дати список rmкоманді в sftp, вона бере лише один шлях, як написано на сторінці man:

rm path
    Delete remote file specified by path.

1

Я зазвичай використовую lftpдля цього.

Налаштування - на сервер rmeote
$ mkdir adir
$ touch afile1 afile2
$ ls
afile1  afile2
тепер видаляємо
$ 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

Щоб зробити це єдиною командою:

$ lftp sftp://sam@skinner -e "cd ~/adir; mrm $file_list; bye"

Я не в змозі виконати команду lftp, можливо, для цього потрібні деякі бібліотечні файли.
bhawna

@bhawna - він може бути встановлений.
slm

1

Якщо ви можете sftp, ви не можете запустити ssh? Якщо так, то така команда, як:

 ssh user@hostname rm file1 file2 

повинні добре працювати. Якщо ви користуєтесь державними / приватними ключами SSH, не буде запиту пароля.


Так, це спрацювало, але вищевказана команда не створює жодної інформації журналу, і вимога полягає також у створенні журналу (хоча я не вказав його у питанні). Спасибі
bhawna

1

Якщо це імена файлів. Ви можете видалити їх за допомогою глобального шаблону за допомогою

rm file*

Ну, це точно не я.
Kusalananda

Я спробував цей метод, і він працює, якщо ви використовуєте SFTP для доступу до віддаленого сервера.
MrMauricioLeite
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.