Como posso usar o terminal Linux para copiar tudo no diretório atual para um subdiretório?
Como posso usar o terminal Linux para copiar tudo no diretório atual para um subdiretório?
Respostas:
Se você deseja copiar o conteúdo da pasta recursivamente (lançará 1 erro, alternativas abaixo):
cp -r * sub/
Um pouco mais hacky, mas funciona em subdiretórios não vazios:
TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"
Outro oneliner:
TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done
Ou recursivo:
TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done
find
código: D
xargs
ou -exec
. Não há necessidade de grep
uso ! -name "$TARGETDIR"
ou similar. Você tem aspas sem igual $file
. Eu não acho que uma recursiva cp
funcione da maneira que você pretende, exceto seu primeiro comando.
Supondo target
é o nome do subdiretório de destino, se o seu shell for bash:
shopt -s extglob
cp -r !(target) target/
No ksh, você pode fazer diretamente cp -r !(target) target/
.
No zsh, você pode fazer setopt ksh_glob
isso cp -r !(target) target/
. Outra possibilidade é setopt extended_glob
então cp -r ^target target/
.
Eu sugeriria mover o diretório de destino para fora do diretório de origem e colocá-lo novamente; O mv é gratuito (se você tiver cuidado para não mudar para um sistema de arquivos diferente), a menos que esteja esperando que outros processos interfiram / sejam interferidos.
A maioria das soluções postadas acima não funcionará se houver espaços nos nomes de arquivos. Eu sugeriria o uso de variantes de find -print0 | xargs -0 ou find -exec, etc.
Isso funcionará para você?
cp -r * subdir/
Se você pretendia mover em vez de copiar tudo no diretório atual para um subdiretório, você poderia fazer:
mv * subdir/
Isso copiará tudo, incluindo arquivos de ponto, e não incluindo o próprio diretório de destino, para o diretório de destino SUBDIR
:
for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done
Isso diz no arquivo dirCopy.sh
for i in `ls`
do
if [ $i != "subDir" ]
then
`cp -r $i subDir`
fi
done
execute-o como "sh dirCopy.sh" no seu console
ls
: for file in *
. Não há necessidade de retalhos - use $()
. Não há necessidade de reticências (ou $()
) ao redor do cp
comando (que produzirá uma mensagem de erro).