Sposta file e cartelle in modo ricorsivo su Linux


75

Tener conto di:

ls -al ../public-back
drwxrwxr-x  4 apache   apache     4096 Apr 19 03:32 templates

ls -al ../public-back/templates

drwxrwxr-x  2 apache   apache    4096 Apr 19 03:33 content
drwxrwxr-x  2 apache   apache   20480 Apr 20 06:14 images
drwxrwxr-x  2 apache   apache    4096 Apr 19 03:35 video

ls -al /public

drwxrwxr-x  4 apache   apache     4096 Apr 20 09:49 templates

ls -al /public/templates

drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 content
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 images
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 video

Come posso spostare il contenuto di /public-back/templatesricorsivamente con le autorizzazioni in /public/templates?


mv ../public-back/templates/* public / templates /

mv -R ../public-back/templates/* public/templates/Vorrei ancora votare per spostare la domanda.

2
mv: opzione non valida - R @Vladislav Zorov

3
ho fatto cp -a ../public-back/templates/ public /

Risposte:


92

A meno che non fraintenda la domanda, questo funzionerebbe:

mv /public-back/templates/* /public/templates

Inoltre, a meno che tu non abbia un enorme elenco di file, l'aggiunta -ichiederà prima di sovrascrivere qualsiasi cosa, il che aggiunge un po 'di sicurezza quando si utilizzano caratteri jolly come *.


14
Questo non sposta i file nascosti.
Arda,

2
Vedere askubuntu.com/a/259386/358964 per l'impostazione di dotglob in modo da spostare anche i file nascosti.
mkobit,

3
Nota: questo non sovrascriverà i file nelle sottodirectory. Riceverai un Directory not emptymessaggio.
Armstrongest,

Sembra che abbia appiattito la gerarchia di directory. Per me non ha conservato le cartelle all'interno della cartella originale. Tutti i file sono finiti nella stessa cartella, anziché spostare letteralmente la cartella originale con la stessa struttura.
Robert Noack,

Questa soluzione funziona, ma se si vede questo errore: mv: target '/public/templates' is not a directorybasta creare la cartella di destinazione manualmente: mkdir /public/templates.
Ali Shabdar

8

La pagina man per cp afferma:

-p same as --preserve=mode,ownership,timestamps
-r same as --recursive=copy directories recursively

Provare;

cp -rp /public-back/templates/* /public/templates/

13
mvè per mossa , mentre cpper copia - una distinzione semantica / etimologica.
Marius Butuc,

cpè molto più lento di mv. cpimpone al computer di copiare tutto dal disco alla RAM, quindi di scriverlo nuovamente sul disco, il che può richiedere molto tempo a seconda della dimensione dei file. Tuttavia, mvaccade sempre all'istante perché solo i collegamenti devono essere riscritti.
martedì

4

Quando ho spostato oggetti dalla mia chiavetta USB al mio sistema OSMC, ho trovato molto utile quanto segue:

find /media/Pi\ Hard\ 16GB/ -name '*' -exec mv -v {} /media/External\ HDD/Videos/ \;

Spiegazione su come funziona di seguito.

A proposito, non dimenticare di aggiungere una barra rovesciata prima di qualsiasi spazio nei nomi delle directory di origine o di destinazione (vedi sopra).

find  finds all files and folders in the destination path.

/media/Pi Hard 16GB/ is the path searched. Escape special char such as spaces.

-name '*' filters on names. If you do not escape or quote this then 
          the shell will expand it before find sees it.

-exec     Executes a command, in our case mv

-v        Verbose, so you can see what's happening (optional)

{}        is replaced by the name of the found object.

In effetti, stai trovando tutti i file e tutte le cartelle e spostandoli uno per uno (o se una directory viene trovata per prima, stai spostando quella directory e il suo contenuto). Questo avvia un nuovo processo per ogni mossa ed è molto inefficiente. Usalo solo quando i comandi regolari falliscono.


2

mv non sembra farlo. Ma puoi usare questo piccolo trucco, funziona come un incantesimo:

tar cf - . |(cd /targetdir; tar xvf -)

e conserva le autorizzazioni e tutto il resto.

Nota: nessuna delle precedenti ha funzionato per me, ecco perché questa soluzione alternativa.


1
cp -a --link ../public-back/* /public/.  &&  rm -rf ../public-back

Quindi creare collegamenti fisici nella directory di destinazione e rimuovere la directory di origine. 'mv' semplicemente non funzionerà nel tuo caso, e in generale funziona solo quando dir dir e dest non hanno sottotitoli comuni.

Si noti che suppongo che la parola "sposta" nella domanda significhi che la directory di origine dovrebbe essere scomparsa dopo l'operazione.

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.