Copia del contenuto della directory corrente in una sottodirectory


13

Come posso usare il terminale Linux per copiare tutto nella directory corrente in una sottodirectory?


Intendi copiare o spostare?
Craig,

Risposte:


12

Se vuoi copiare ricorsivamente il contenuto della cartella (genererà 1 errore, alternative di seguito):

cp -r * sub/

Un po 'più confuso, ma funziona su sottodirectory non vuote:

TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"

Un altro oneliner:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

O ricorsivo:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done

questo non funziona nel caso in cui sub / non sia vuoto -> sub verrà nuovamente copiato in sub, a meno che non sia quello che voleva @Oguz.

Ok, sono finalmente soddisfatto del findcodice: D
Lekensteyn,

2
Il tuo secondo comando ha esito negativo per i nomi di file che includono spazi. Usa xargso -exec. Non c'è bisogno di grep- uso ! -name "$TARGETDIR"o simili. Hai citazioni senza pari in giro $file. Non credo che un ricorsivo cpfunzionerà come intendi in nessuno tranne che nel tuo primo comando.
In pausa fino a ulteriore avviso.

Wohaa, ha perso una citazione negli ultimi codici. Buon commento Dennis, non ho mai pensato di usare -name in questo caso :)
Lekensteyn

4

Supponiamo che targetsia il nome della sottodirectory target, se la tua shell è bash:

shopt -s extglob
cp -r !(target) target/

In ksh, puoi farlo direttamente cp -r !(target) target/.

In zsh, puoi farlo setopt ksh_globallora cp -r !(target) target/. Un'altra possibilità è setopt extended_globquindi cp -r ^target target/.


2

Suggerirei di spostare la directory di destinazione al di fuori della directory di origine e quindi reinserirla di nuovo; mv è gratuito (se stai attento a non passare a un altro filesystem), a meno che non ti aspetti che altri processi interferiscano / vengano interferiti.

La maggior parte delle soluzioni pubblicate sopra non funzionerà se ci sono spazi nei nomi dei file. Suggerirei di usare varianti di find -print0 | xargs -0 o trova -exec, ecc.


0

Funzionerà per te?

cp -r * subdir/

Se intendevi spostare invece di copiare tutto nella directory corrente in una sottodirectory, potresti fare:

mv * subdir/

questo non si occupa delle directory non vuote

Ho appena testato e ha funzionato.
karlphillip,

devi copiare ricorsivamente le directory non vuote come suggerito da @Lekensteyn.

-1

Ciò copierà tutto, compresi i file punto e non includendo la directory di destinazione stessa, nella directory di destinazione SUBDIR:

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done

2
Non riesce per i nomi di file che includono spazi.
In pausa fino a ulteriore avviso.

-1

Questo vale per dire il file dirCopy.sh



for i in `ls`
do
        if [ $i != "subDir" ]
        then
                `cp -r $i subDir`
        fi
done

eseguilo come "sh dirCopy.sh" nella tua console


2
Non c'è bisogno di ls: for file in *. Non c'è bisogno di backtick - usare $(). Non c'è bisogno di backtick (o $()) attorno al cpcomando (che produrrà un messaggio di errore).
In pausa fino a ulteriore avviso.
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.