Come spostare tutti i file nella cartella corrente nella sottocartella?


70

Sono sul sentiero:

/myuser/downloads/

E creo una sottocartella:

/myuser/downloads/new

Ora voglio spostare tutti i file e le cartelle / sottocartelle nella cartella dei download nella sottocartella.

come posso fare questo?

Provai:

mv -R *.* new/

Ma spostare non prende l'interruttore -R sembra.


4
Non hai bisogno di -R. Solo però mv * new, gemerà "non può passare da nuovo a nuovo" o qualcosa di simile. Forse mv -i * newa te prevenire le sovrascritture.

Risposte:


101

Il comando

mv !(new) new

dovrebbe fare il trucco. Se non funziona, esegui shopt -s extglobprima.

Per spostare anche file / directory nascosti (che iniziano con un punto), esegui anche shopt -s dotglobprima.
Quindi, per riassumere:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(è sempre meglio disinserirsi dotglobper evitare brutte sorprese).


5
puoi dire qual è il significato di !(something)?
Adeerlike

2
@adeer che sta solo dicendo di no (qualcosa). In altre parole, copia tutto ma non qualcosa. Chiaro come fango?
RockyMountainAlto

4
molto. ti capita di conoscere l'equivalente di zsh?
Adeerlike

1
Non capisco, ad esempio cosa succede Se provo a spostare il contenuto della cartella devnella posizione corrente, devo eseguire mv !(dev) dev?? Ricevo-bash: !: event not found
Black

5
@adeer molto simile. setopt extendedglobper impostare la modalità glob estesa in zsh. ^è il simbolo di esclusione, quindi mv ^new newfarebbe il trucco. quindi per vedere tutte le opzioni impostate in zsh che puoi usare setopte per disabilitare la modalità glob estesa che puoi fareunsetopt extendedglob
Mr. T

10

Ho trovato qualcosa del genere ma è un po 'più semplice da capire e potrebbe funzionare anche per te:

ls | grep -v new | xargs mv -t new

Aggiunta di una spiegazione alla soluzione sopra:

Dalle pagine man:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

Spiegato per passo:

  • ls elencherà i file nella directory corrente
  • grep -v new tornerà reindirizzato a quello non corrisponde a nuovo
  • xargs mv -t newsposta i file inviati ad esso dalla grep -vdirectory di destinazione

Ho provato questo metodo, ma sto ottenendo: mv: illegal option -- t. È perché sto usando zsh?
ConstantFun

@ConstantFun Potrebbe essere zsh ma immagino sia la tua implementazione di mv(il che significa che la tua versione di mv è diversa da quella che stavo usando) quale sistema operativo stai usando? Credo che quando ho scritto questa risposta ero su Linux centosutilizzando la distribuzione bash.
Lockwobr

2
Sto solo provando questo su OSX e ottengo lo stesso errore, mv: illegal option -- tperché la MV di OSX non ha -tun'opzione.
Lockwobr

1
(Non ho provato questo, e non ho intenzione di pensarci su.) Questo link apple.stackexchange.com/questions/69223/… ti dice come installare gnucore che dovrebbe aiutarti a ottenere gnu core cli utils, osx viene fornito con bsd strumenti cli diversi da quelli forniti con Linux.
Lockwobr

Sono su OSX in esecuzione zsh, quindi probabilmente è il sistema operativo quindi ..? Grazie per il chiarimento!
ConstantFun

7

Idea semplice. Dando per scontato che in / myuser , rinominare download di nuovo , creare un nuovo download directory quindi spostare nuovo in esso.

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

Se vuoi spostare tutti i file da una cartella in una delle sue sottocartelle puoi usare il seguente comando:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

Troverà tutti i file e poi li sposterà nella tua sottocartella.

@waltinator: aggiunto -type d -name 'new' -pruneper impedire l'attraversamento di /myuser/downloads/new.


Ho creato una sottodirectory denominata newe ho provato questo comando, ricevo mv: missing file operandeTry 'mv --help' for more information
mook765 il

1

Puoi provare questo processo alternativo –– rimanere nel percorso

/myuser/downloads/

ma, invece di prima creazione della /myuser/downloads/new/directory, invece creare una cartella nella /myuser/directory, con il comando mkdir ../new, quindi spostare tutti i file downloadsper new, e, infine, muoversi newin downloads. Puoi farlo in una riga, mentre sei nel /myuser/downloads/percorso, con il comando:

mkdir ../new && mv * ../new && mv ../new ../downloads

In questo caso, non c'è bisogno di preoccuparsi di qualsiasi sorta di "filtro" di file / cartelle, dal momento che newè allo stesso livello del percorso come downloads, in modo da poter basta spostare tutto in downloadsa new, e quindi spostare newin downloads`.

Tuttavia, se hai già creato la sottocartella newe non vuoi crearne un'altra, non ti preoccupare, basta cambiare il mkdircomando sul lato sinistro del primo &&nel comando mostrato sopra in un mvcomando, spingendo newverso l'alto nel sentiero; in altre parole, mentre sei ancora dentro /myuser/downloads/, puoi cambiare mkdir ../newin mv new ... Quindi la sottocartella new[nel percorso /myuser/downloads/new/] viene spostata su /myuser/new/, allo stesso livello di /myuser/downloads/, e quindi è possibile eseguire il resto del comando come mostrato sopra. Tutti insieme, abbiamo, a partire dal percorso /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

e, poiché si voleva "spostare tutti i file e le cartelle / sottocartelle nella cartella dei download nella sottocartella [ new]", il gioco è fatto! Se avessi voluto spostare solo i file (o solo le cartelle o [inserire un movimento più granulare degli oggetti]), allora dovresti usare altri comandi che possono "filtrare" gli oggetti, come grep. I comandi sopra scritti sono sufficienti per i tuoi scopi.

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.