Cómo eliminar múltiples archivos usando sftp

13

Esta publicación trata sobre la eliminación de múltiples archivos del servidor remoto, cuando se configura la conexión sin contraseña sftp. Tengo el código de la siguiente manera. Solo el primer archivo de la variable $file_listse elimina, cuando tengo la variable establecida como,

$file_list="file1 file2"

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

Incluso intenté ejecutar los comandos en modo rápido.

sftp $USER@$HOST
rm file1 file2

Sin embargo, todavía veo que solo el archivo1 se está eliminando.

No estoy seguro de si me falta algún comando básico. Intenté mdelete/ mdel/ mrm, que fueron rechazados como comando no válido en la ventana de solicitud sftp.

bhawna
fuente

Respuestas:

8

Aquí hay una posible solución que se puede agregar al script bash. Esto no es ideal ya que hará una nueva conexión para cada archivo.

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

¡Esta frase es mucho mejor! file1-9 son nombres de archivos para eliminar, use una variable si lo desea, es lo mismo.

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
fuente
¿Qué pasa si los archivos tienen espacios en blanco en su nombre? ¿Funcionará esta solución?
codeforester
Puede citar los nombres de los archivos. Si tiene muchos de ellos, le sugiero que busque en la expansión de parámetros bash para obtener mejores resultados. En general, para simplificar, un administrador no permitirá nombres de archivo con espacios en blanco y caracteres relacionados.
mbiber
1

No puede dar una lista al rmcomando en sftp, solo toma una ruta como está escrito en la página del manual:

rm path
    Delete remote file specified by path.
usuario90256
fuente
1

Normalmente suelo lftphacer esto.

Configuración - en rmeote server skinner
$ mkdir adir
$ touch afile1 afile2
$ ls
afile1  afile2
ahora borramos
$ 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

Para hacerlo un solo comando:

$ lftp sftp://sam@skinner -e "cd ~/adir; mrm $file_list; bye"
slm
fuente
No puedo ejecutar el comando lftp, puede que requiera algunos archivos de la biblioteca.
bhawna
@bhawna: puede que no esté instalado.
slm
1

Si puede sftp, ¿no puede ejecutar ssh? Si es así, entonces un comando como:

 ssh user@hostname rm file1 file2 

Debería funcionar bien. Si utiliza claves SSH públicas / privadas, no se solicitará la contraseña.

mdpc
fuente
Sí, funcionó, pero el comando anterior no crea ninguna información de registro, y el requisito es crear el registro también (aunque no lo especifiqué en la pregunta). Gracias
bhawna
1

Si esos son los nombres de archivo. Puede eliminarlos usando un patrón global con

rm file*
Philip Rego
fuente
Bueno, seguro que no fui yo.
Kusalananda
He intentado este método y funciona si está utilizando SFTP para acceder a su servidor remoto.
MrMauricioLeite