Sposta il contenuto della cartella di un livello superiore


127

Ho una directory che è spacchettata, ma è in una cartella. Come posso spostare i contenuti di un livello? Sto accedendo a CentOS tramite SSH.

Risposte:


189

Con la cartella denominata "myfolder" e un livello superiore nella gerarchia dei file (il punto che si desidera inserire) il comando sarebbe:

mv myfolder/* .

Così, per esempio, se i dati sono stati in /home/myuser/myfolderpoi da /home/myuser/eseguire il comando.


35
Potrebbe essere necessario abbinare anche .*non solo *se l'archivio conteneva file dot. Aggiungi anche `&& rmdir myfolder` alla fine per rimuovere la cartella ora estranea. Questo viene salvato perché verrà eseguito solo se mv restituisce esito positivo E perché rmdir non rimuoverà una directory non vuota.
Caleb,

Buon punto sul .*. Rimuovere la cartella originale è sia banale che non richiesto, quindi faremo in modo che OP lo gestisca da solo.
Rudu,

1
@Caleb è possibile scrivere entrambi *e .*in una riga? solo curiosità
Richard

2
@Richard Sì, lo è. Gli argomenti per mvsaranno tutti i sorgenti tranne l'ULTIMO argomento che deve essere il bersaglio per lo spostamento (e nel caso di più fonti, deve essere una cartella).
Caleb,

1
Ricevo bash:/bin/mv: Argument list too long
dragosrsupercool il

26

Giusto per renderlo chiarissimo, tratto dalla risposta di Rudu sopra e dai commenti.

Se è necessario spostare tutti i contenuti, COMPRESI i file che iniziano con a. (come .htaccess, .git, ecc.), devi includere sia * che. * nel tuo comando. Così:

 mv subfolder/* subfolder/.* .

In questo modo il contenuto della sottocartella verrà spostato nella cartella corrente. Nota lo spazio prima dell'ultimo ".".


funziona ma ho capito mv: rename fake/. to ./.: Invalid argumentemv: rename fake/.. to ./..: Invalid argument
Maslow il

16

Questo è possibile con i seguenti metodi:

  • Utilizzando rsync:

    rsync -vua --delete-after foo/ .
  • Utilizzando cpe rmdir:

    cp -vaR foo/. . && rmdir foo/
  • Utilizzo mv(con dotglobopzione abilitata):

    shopt -s dotglob # Includes filenames beginning with a dot.
    mv -- foo/* .    # Where foo/ is the folder consisting the files.
    shopt -u dotglob # Disables previously enabled dotglob option.

    dov'è la foo/tua cartella il cui contenuto deve essere spostato di un livello superiore.

    Vedi: help shopte man bash.

  • Utilizzo mv(come suggerito qui ):

    mv foo/* foo/.[^.]* . && rmdir foo/

    Nota: perderebbe un file chiamato foo/..bar...

    Nota: per le shell POSIX, è necessario [!.].


Quali sono gli interruttori rsync -v, -u, -ae -rfacendo? AFAICT, -vè dettagliato, il che rende rsync più informazioni di stampa. -usignifica aggiornamento: copia un file solo se è più recente. Non sembra rilevante. -asignifica archivio. Ciò copierà il proprietario e le autorizzazioni del file e renderà la sincronizzazione ricorsiva. -rsignifica ricorsivo, ma è già coperto da -a.
rjmunro,

-uè utile quando non si desidera dedicare più tempo allo spostamento dei dati già presenti (soprattutto per i dispositivi di archiviazione lenti). Ho rimosso -r, poiché è coperto da -acome hai menzionato.
Kenorb,

1
mv foo/* foo/.[^.]* .perderebbe un file chiamato foo/..bar..ad esempio. Si noti che per le shell POSIX è necessario [!.].
Stéphane Chazelas,

Va menzionato che rsync -vua --delete-after foo/ .elimina tutto ciò che potrebbe già esistere nella directory corrente.
David

7

basta emettere un comando mv

mv (directory)/* .

se si desidera eliminare la directory, quindi aggiungere

rm -rf (directory)

Supponendo che ci si trovi in ​​una directory padre di (directory)

Se ti trovi all'interno della (directory), allora

mv * ../

13
Consiglio di sicurezza aggiuntivo: quando si elimina una directory che si sa che dovrebbe essere vuota, si rmdirlamenta ed esce se la directory non è vuota, mentre rm -rinvece dovrebbe semplicemente eliminarla e tutto il suo contenuto. (È un poka-giogo .)
Anko

Ottimo punto! Non riesco a pensare a un motivo per non farlo in questo modo.
Mark Lalor,

@MarkLalor Uno dei motivi potrebbe essere la presenza di file nascosti, come l'onnipresente .DS_storein macOS. Il mvcomando sopra non sposta questi (senza dotglobset).
AkselA

0

per quelli di voi su un server condiviso dovreste usare qualcosa del genere

Per spostare i file

mv -v ~/public_html/public_html/* ~/public_html/

Per copiare i file

cp -a ~/public_html/public_html/* ~/public_html/


2
La domanda sopra si pone sullo spostamento e non sulla copia dei contenuti. Ciò duplicherebbe i file lasciando gli originali in una sottocartella. Anche essere un server "condiviso" o davvero non ha nulla a che fare con questo.
Caleb,

1
alla tua destra ed ecco la risposta per questo ...
Ricardo Havoc,

2
Per quanto riguarda la tua modifica: in che modo differisce dalla risposta già votata ? E cosa c'entra un "server condiviso" con esso? Si prega di modificare per spiegare questi elementi se questo sta per essere un contributo utile che aggiunge valore a ciò che è già qui.
Caleb,

1
Non sono d'accordo sul fatto che il server condiviso non abbia nulla a che fare con esso. Il modo in cui viene immessa la "dir" fa la differenza.
Ricardo Havoc,

1
amico perché sei così arrabbiato? ... wow .. stavo solo condividendo un po 'di conoscenza. Comprendiamo tutti in modo diverso e affrontiamo diversi problemi tecnici in modo diverso ... Passa una buona giornata Caleb ..
Ricardo Havoc,
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.