Come posso usare il terminale Linux per copiare tutto nella directory corrente in una sottodirectory?
Come posso usare il terminale Linux per copiare tutto nella directory corrente in una sottodirectory?
Risposte:
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
find
codice: D
xargs
o -exec
. Non c'è bisogno di grep
- uso ! -name "$TARGETDIR"
o simili. Hai citazioni senza pari in giro $file
. Non credo che un ricorsivo cp
funzionerà come intendi in nessuno tranne che nel tuo primo comando.
Supponiamo che target
sia 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_glob
allora cp -r !(target) target/
. Un'altra possibilità è setopt extended_glob
quindi cp -r ^target target/
.
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.
Funzionerà per te?
cp -r * subdir/
Se intendevi spostare invece di copiare tutto nella directory corrente in una sottodirectory, potresti fare:
mv * subdir/
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
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
ls
: for file in *
. Non c'è bisogno di backtick - usare $()
. Non c'è bisogno di backtick (o $()
) attorno al cp
comando (che produrrà un messaggio di errore).