Jak usunąć wiele plików za pomocą sftp

13

Ten post dotyczy usuwania wielu plików ze zdalnego serwera, gdy konfigurowane jest połączenie bez hasła sftp. Mam kod jak poniżej. Usuwany jest tylko pierwszy plik w zmiennej $file_list, gdy zmienna jest ustawiona jako,

$file_list="file1 file2"

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

Próbowałem nawet wykonywać polecenia w trybie monitu.

sftp $USER@$HOST
rm file1 file2

Nadal jednak widzę, że usuwany jest tylko plik 1.

Nie jestem pewien, czy brakuje mi podstawowego polecenia. Próbowałem mdelete/ mdel/ mrm, które zostały odrzucone jako nieprawidłowe polecenie w oknie zachęty sftp.

Bhawna
źródło

Odpowiedzi:

8

Oto jedno z możliwych rozwiązań, które można dodać do skryptu bash. Nie jest to idealne, ponieważ spowoduje nowe połączenie dla każdego pliku.

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

Ten jednowarstwowy jest znacznie lepszy! file1-9 to nazwy plików do usunięcia, użyj zmiennej, jeśli chcesz, to to samo.

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
źródło
Co jeśli pliki mają w nazwie białe spacje? Czy to rozwiązanie zadziała?
codeforester,
Możesz podać nazwy plików. Jeśli masz ich wiele, sugeruję zajrzeć do rozszerzenia parametrów bash, aby uzyskać najlepsze wyniki. Zasadniczo dla uproszczenia administrator nie zezwala na nazwy plików z białymi spacjami i pokrewnymi znakami.
mbiber
1

Nie możesz podać listy do rmpolecenia w sftp, pobiera tylko jedną ścieżkę zapisaną na stronie podręcznika:

rm path
    Delete remote file specified by path.
użytkownik90256
źródło
1

Zwykle tego używam lftp.

Konfiguracja - na skanerze serwera rmeote
$ mkdir adir
$ touch afile1 afile2
$ ls
afile1  afile2
teraz usuwamy
$ 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

Aby uczynić to jednym poleceniem:

$ lftp sftp://sam@skinner -e "cd ~/adir; mrm $file_list; bye"
slm
źródło
Nie jestem w stanie wykonać polecenia lftp, być może wymaga to plików biblioteki.
bhawna
@bhawna - może nie być zainstalowany.
slm
1

Jeśli możesz sftp, nie możesz uruchomić ssh? Jeśli tak, to polecenie takie jak:

 ssh user@hostname rm file1 file2 

powinien działać dobrze. Jeśli użyjesz publicznego / prywatnego klucza SSH, hasło nie będzie wyświetlane.

mdpc
źródło
Tak, działało, ale powyższe polecenie nie tworzy żadnych informacji w dzienniku, a warunkiem jest także utworzenie dziennika (chociaż nie określiłem go w pytaniu). Dzięki
bhawna
1

Jeśli są to nazwy plików. Możesz je usunąć za pomocą wzorca globu za pomocą

rm file*
Philip Rego
źródło
Cóż, to na pewno nie byłem ja.
Kusalananda
Wypróbowałem tę metodę i działa ona, jeśli używasz SFTP w celu uzyskania dostępu do zdalnego serwera.
MrMauricioLeite,