Buongiorno sarà una domanda idiota ma non ne esco

SITUAZIONE: ho cartella1 con all'interno centinaia di files. Dentro cartella1 creo sottocartella1

OBIETTIVO: spostare tutti i files in cartella1 dentro sottocartella1

Ho provato (da dentro cartella1)

mv * sottocartella1

ma ottengo

cannot move a dir to a subdirectory of itself

Chiaramente perche' il mio comando genera il paradosso di spostare la cartella dentro se stessa. Come fare da command line?

Grazie

chiesto 13 Nov '14, 09:03

Ercole77's gravatar image

Ercole77
794411


Bash è abbastanza potente da permettere dei pattern più complessi del semplice *. Con gli extended glob è possibile escludere degli elementi, per esempio !(aaa|bbb|ccc) corrisponde a tutto tranne quei tre elementi.

Nel caso specifico, il comando

mv !(subdir) subdir/

muove tutti i file (ed eventuali directory) della directory corrente nella sottodirectory di nome subdir, ad esclusione della stessa subdir.

Attenzione, se lo si vuole utilizzare in uno script, è necessario abilitare preventivamente gli extended glob con il comando:

shopt -s extglob

cosa che non è necessaria in una shell interattiva, dove gli extended glob sono abilitati di default.

Riferimento: una mia risposta su AskUbuntu.

coll. permanente

ha risposto 13 Nov '14, 09:53

enzotib's gravatar image

enzotib ♦♦
14.0k113186

Quello che farei io è spostarli in una cartella allo stesso livello di quella di partenza e poi spostare la cartella.

cd TUA_CARTELLA
mkdir ../cartella1
mv * ../cartella1
mv ../cartella1 .

Ovviamente più che spostare sarebbe meglio copia-incollare e poi cancellare (così eviti di rischiare di perdere i files nel frattempo), cp + rm.

Se però dentro questa TUA_CARTELLA ci sono solo files (e non directory) ci possono essere soluzioni diverse che selezionino solo i files e non le cartelle, tramite un comando find, come ad esempio queste presentate in questa risposta su AskUbuntu.

Ovviamente i comandi sopra possono essere inseriti in uno script e poi in un alias, in modo che ti basti dare un comando solo con due input (il nome della cartella di partenza e quello della futura sottocartella, come mv) e si occupi lui di tutto.

coll. permanente

ha risposto 13 Nov '14, 09:39

dadexix86's gravatar image

dadexix86 ♦♦
17.0k916161

modificato 13 Nov '14, 09:43

Grazie ragazzi

hop abilitato con successo gli extended glob e ho trovando anche come alternativa

find -type f -exec mv {} sottocartella1  \;

Ho un dubbio ma il \; finale fa parte della sintassi di find -exec ?

(13 Nov '14, 10:50) Ercole77 Ercole77's gravatar image
1

@Ercole77, sì, find richiede un ; per capire dove finisce il comando relativo alla -exec, il \ è richiesto per evitare che il ; venga interpretato dalla shell anziché da find. Una alternativa leggermente più efficiente è la seguente

find -type f -exec mv -t sottocartella1 {} +

Inoltre io aggiungerei anche -maxdepth 1

(13 Nov '14, 12:54) enzotib ♦♦ enzotib's gravatar image

ciao Enzo che differenza c'è tra il + con cui concludi il tuo comando e il \; ?

(13 Nov '14, 13:13) Ercole77 Ercole77's gravatar image

@Ercole77: con il + la -exec viene eseguita con quanti più parametri in coda che possa raggruppare, immagina la differenza tra:

mv file1 dir/
mv file2 dir/
mv file3 dir/

e

mv -t dir/ file1 file2 file3
(13 Nov '14, 18:48) enzotib ♦♦ enzotib's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×10

domanda posta: 13 Nov '14, 09:03

domanda visualizzata: 3,748 volte

ultimo aggiornamento: 13 Nov '14, 18:48

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.