scp tutti i file che terminano '-123.jpg': ricorsione, spazi, caratteri jolly ...


1

C'è troppo da fare per me per portare la mia testa di noobie qui intorno. Voglio scaricare tutti i file che terminano -123.jpg da una moltitudine di directory nidificate su un server remoto. Alcune di queste directory hanno spazi nei loro nomi. Sto pensando che il comando dovrebbe essere sulla falsariga di:

scp -r user@server:/path/to/parent\ directory/*/*/*123\.jpg ./

... dove "parent \ directory" è un nome di directory con uno spazio e il percorso specificato diventa il più profondo possibile prima di dividersi in varie sottodirectory, ad esempio dir / sub dir / [uniquely_id] -123.jpg file . (Notare che spesso anche queste sottodirectory contengono spazi, che dovrebbero influire sul carattere jolly *)

Mi viene restituito "nessuna corrispondenza" per questo o "nessun file o directory" se mi immischio con lo spazio che fuoriesce. Penso quindi che sia la ricorsione o il carattere jolly che ho sbagliato.

Grazie in anticipo.

Risposte:


3

Mancando il layout del server per i test, non so se il seguente comando funzioni davvero, ma penso che rsync sarebbe meglio di scp in quel caso, poiché è possibile specificare schemi di inclusione ed esclusione. Qualcosa di simile a:

rsync -arvzSH  --include "*123.jpg" --exclude "*" user@server:/path/to/parent\ directory/ /path/to/target directory/

potrebbe funzionare. Ma è meglio ricontrollare la documentazione di rsync .


1

Il nome del file che scappa con scp è complicato; i tuoi argomenti vengono (ri) espansi sul lato remoto. I caratteri "interessanti" devono essere racchiusi tra virgolette doppie, per evitare speciali passaggi dalla shell locale e dal telecomando. Mi aspetterei che entrambi funzionino per te:

scp user@server:'/path/to/parent\ directory/*/*/*123.jpg' ./
scp user@server:'"/path/to/parent directory"/*/*/*123.jpg' ./

Se questo è confuso, rsync è abbastanza facile da usare (come menziona lothar), e anche il piping di tar o cpio attraverso ssh è abbastanza facile.

ssh user@server 'cd /path/to/parent\ directory;
                 find -name "*123.jpg" -print0 | cpio -0 -o' |
    cpio -i -d -v

0

Questo dovrebbe essere fatto correttamente in due parti:

  1. trova prima tutti i file necessari e copiali in una cartella (questo non funziona se hai gli stessi nomi di file) - puoi farlo con uno finde-exec
  2. quindi invia un mucchio di file usando scp

scp non è abbastanza avanzato per copiare la struttura delle cartelle e non esiste un singolo comando per creare una copia di un albero di cartelle.

Inoltre, se hai bisogno di tutti i file nelle cartelle, poiché non sarai in grado di selezionarli con i caratteri jolly e desideri preservare la struttura delle cartelle - potresti voler usare mc= Midnight Commander e il suo "collegamento Shell".


-1

Una soluzione per scp con caratteri jolly:

for i in "*-123.jpg"
do 
    scp $i <user>@<server>:/path/to/destination/
done

Consultare: https://community.hpe.com/t5/System-Administration/How-to-scp-mutiple-files-using-wild-chars-or-in-a-single-scp/mp/3639440/highlight/ vero # M238959


Cosa succede se il nome file del file conterrà spazio? Non funzionerà, penso. Forse il findcomando sarebbe migliore (con xargs)?
pbies

Non sei sicuro del perché -1? la soluzione funziona. Se ci sono altri scenari, può essere ulteriormente migliorato. Ma la soluzione data NON è sbagliata.
AmitM,

1
Per questa domanda particolare la risposta è ok, ma proviamo a rendere le cose universali. Ci sono alcuni bug in questa risposta: 1. mai for ls2. $idovrebbe essere tra virgolette 3. finddovrebbe essere usato
pbies

1) aggiornata la risposta per rimuovere 'ls', non richiesto. 2) $ i funziona senza virgolette 3) funziona per file con spazio nei nomi.
AmitM

1
Non sono sicuro di quale shell stai usando, ma in sh / bash di fatto standard, un $ i non quotato avrà il suo valore soggetto alla suddivisione delle parole e quindi i valori con spazi in essi non funzioneranno come previsto - loro ' Verrà passato a scp come più argomenti, ognuno con parte del nome del file.
Grawity
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.