Como mover todos os arquivos do diretório atual para o diretório superior no linux?
Eu tentei algo como mv *.*
, mas não funciona.
Como mover todos os arquivos do diretório atual para o diretório superior no linux?
Eu tentei algo como mv *.*
, mas não funciona.
Respostas:
O comando que você está procurando é
mv * .[^.]* ..
ou (veja abaixo para mais informações):
(shopt -s dotglob; mv -- * ..)
Explicação: o mv
comando move arquivos e diretórios. O último argumento para mv
é o destino (neste caso, o diretório um passo "acima" na árvore ..
). Os argumentos anteriores são os arquivos e diretórios de origem. O asterisco ( *
) é um curinga que corresponde a todos os arquivos que não começam com um ponto. Os arquivos que começam com um ponto (arquivos de ponto) estão "ocultos". Eles são correspondidos usando o padrão .[^.]*
(veja a edição abaixo).
Veja a página de manual que eu vinculei para obter mais informações mv
.
.[^.]*
invés de .*
?Como Chris Johnsen aponta corretamente: o padrão .*
também combina com .
e ..
. Como você não deseja (e não pode) movê-los, é melhor usar um padrão que corresponda a qualquer nome de arquivo que comece com um ponto, exceto os dois . O padrão .[^.]*
faz exatamente isso: ele corresponde a qualquer nome de arquivo (1) começando com um ponto (2) seguido por um caractere que não é um ponto (3) seguido por zero ou mais caracteres arbitrários.
Como Paggas aponta , também teríamos que adicionar o padrão .??*
para corresponder aos arquivos começando com dois pontos. Veja a resposta dele para uma solução alternativa usando find
.
A resposta de Arjan menciona shopt
para evitar todos esses problemas com os dotfiles. Mas ainda há o problema com os arquivos que começam com um traço. E isso requer três comandos. Ainda assim, eu gosto da ideia. Proponho usá-lo assim:
(shopt -s dotglob; mv -- * ..)
Isso é executado shopt
em um subshell (portanto, não é shopt
necessária uma segunda chamada ) e é usado --
para que os arquivos que começam com um hífen não sejam interpretados como argumentos para mv
.
.*
pode fazer com que o mv produz avisos / erros sobre não poder se mover .
e ..
. Você pode tentar mv * .[^.]* ..
.
*
, .[^.]*
e ..?*
. O segundo talvez .[!.]*
para conchas mais antigas (POSIX). Também leia
Resposta curta: use
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Resposta longa:
O comando
mv * .* ..
não funcionará, pois .*
pode corresponder .
e ..
. Mas o comando
mv * .[^.]* ..
também não funcionará, pois .[^.]*
não corresponderá, por exemplo ..filename
! Em vez disso, o que eu faço é
mv * .[^.] .??* ..
que combinará com tudo, exceto .
e ..
. *
corresponderá a tudo que não começa com a .
, .[^.]
corresponderá a todos os nomes de arquivos de 2 caracteres começando com um ponto ..
, exceto , e .??*
corresponderá a todos os nomes de arquivos iniciados com um ponto com pelo menos 3 caracteres.
Melhor ainda, você pode usar
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
que evita os feios hacks da glob mv * .[^.] .??* ..
!
..?*
ao meu comentário e você já cuidou dele.
mv
para parar de procurar outras opções de comando. Os chavetas são um nome de arquivo resultante. O sinal de adição diz que, em vez de executar o exec por resultado (ou seja, por nome de arquivo), coloque o máximo de resultados em um único exec possível. Para ser completo, -t..
é importante mover o destino de destino para o qual mover todos esses arquivos.
Apenas por questões de integridade, também é possível dizer ao shell do Bash para incluir arquivos ocultos, usando shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob
O mv não possui a funcionalidade de mover arquivos ocultos ao usar *
- então, por que não usar cópia?
cp -rf . ..
rm -rf *
Não é necessário entrar em soluções complexas de uso de dotglobbing e usando os comandos find.
cp
e, em rm
vez disso, você está realmente copiando tudo.
rsync -a --remove-source-files . ..
rsync
é uma ferramenta de cópia de arquivos extremamente poderosa, geralmente usada para executar backups e espelhos incrementais remotos eficientes.
Com o comando acima, estamos dizendo rsync
para copiar o conteúdo de .
para..
A opção -a
ativa a recursão em .
subdiretórios e outras opções comuns.
O switch --remove-source-files
diz ao rsync para remover os arquivos de origem após uma cópia bem-sucedida, ou seja, faz com que o rsync se comporte de maneira semelhante ao mv
comando.
--remove-source-files
não removerá diretórios (sincronizados).
-bash: /bin/mv: Argument list too long
erro. Este funciona como o charme.
Por fim, tentar mv .
falhará porque o mv não poderá desvincular o diretório em que você está atualmente. Você pode mv * ..
mover os arquivos no cwd.
mv * .??* ../.
*
obtém todos os arquivos que não são pontos. .??*
recebe tudo. arquivos com pelo menos três bytes, o que funciona para todos os legítimos. Provavelmente, qualquer coisa que você queira é rm
melhor que antes mv
.
O ../.
recurso não oferece nenhum benefício direto, ..
mas, ao fazer uma mudança para o diretório, é um hábito muito bom entrar, porque ele falhará, como você deseja, se houver algo errado com o caminho. Por exemplo, mv xyz bletch
onde você acha que bletch
é um diretório, você pode ter mais certeza mv xyz bletch/.
.
.[^.]
para obter arquivos de capa como .a
.
Este comando minimizado funciona na maioria dos shells modernos:
\mv -- {,.{[^.],??}}* ..
Caso contrário, é mencionada uma solução portátil:
\mv -- * .[^.] .??* ..
Recursos:
\ evita que aliases alterem mv indesejadamente.
- impede que nomes de arquivos contendo hífens principais (-xyz) sejam interpretados como argumentos da linha de comando.
. [^.] corresponde aos dois nomes de arquivos de caracteres que começam com. exceto ..
. ?? * corresponde a todos os outros nomes de arquivos com três caracteres ou mais.
Implementações ingênuas:
O seguinte ignora os nomes de arquivos ocultos do UNIX, aqueles que começam com. (.bashrc).
mv * ..
As seguintes correspondências .. que tentam recursivamente mover todos os diretórios eventualmente de volta para / para .. do diretório de trabalho atual ($ PWD ou pwd). Nunca use.
mv .* ..
É mais correto usar o padrão do * .[!.] .??*
que, * .[^.] .??*
já que o primeiro também funcionará com shells mais antigos, como o ksh88:
mv -- * .[!.] .??* ..
--
evita problemas quando você tem um nome de arquivo que começa com -
*
corresponde a todos os nomes de arquivos que não começam com um .
.
que você pode / deve mover.[!.]
corresponde a todos os dois nomes de arquivo de caracteres que começam com um .
.??*
corresponde a todos os nomes de arquivos de três caracteres (ou mais) que começam com um .
Com o ksh88, o padrão do nome do arquivo de .[^.]
fato corresponderá aos nomes dos arquivos ..
(que sempre existem) e .^
(que provavelmente não existem), tendo um efeito oposto ao desejado.
Encontre e grep também funciona. Esse tipo de estrutura pode ser útil se você quiser selecionar arquivos com critérios mais complicados, modificando find e egrep.
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
Eu acho que a solução mais fácil para mover todos os arquivos para o diretório pai. seria
mv "`ls`" ../
ou, se houver arquivos / diretórios ocultos
usar:
mv "`ls -a`" ../ 2>/dev/null
Além disso, digamos que você queira mover o conteúdo de alguma pasta para uma de suas pastas internas tony (digamos)
usar:
mv "`ls -a`" /tony 2>/dev/null
Nota:
"`ls -a`"
Para mover os arquivos que possuem espaços.
2>/dev/null
É para suprimir o aviso / erro porque ls -a
iria imprimir o .
e ..
pasta tão bem e você não pode mover ou copiá-los. Portanto, para essas pastas, será exibido um erro (se não usarmos 2> / dev / null) que não será possível movê-las e o restante será movido confortavelmente.
Melhor evitar ls -a
se não houver arquivos ocultos e apenas usar ls
.
mv $(ls -a)
? Isso tocaria no diretório atual e no diretório abaixo dele, porque ls -a
será exibido ..
também.
mv ls -a ../
também teria funcionado conforme a necessidade. Sim, ele mostrará os erros como mencionei acima, mas, além disso, ele moverá as pastas / arquivos necessários para o diretório pai.
ls
comando para mover arquivos com espaços. Fiz as alterações necessárias. Obrigado por apontar.
[linux] [mv] [cwd] [files]
algo parecido?