2009-10-28 18:54:06 +0000 2009-10-28 18:54:06 +0000
134
134

Como mover todos os ficheiros do directório actual para o directório superior?

Como mover todos os ficheiros do directório actual para o directório superior no linux?

Eu tentei algo como mv *.*, mas não funciona.

Respostas (11)

204
204
204
2009-10-28 19:01:58 +0000

O comando que procura é

mv * .[^.]* ..
``` ```
(shopt -s dotglob; mv -- * ..)

ou (ver abaixo para mais informações):

(shopt -s dotglob; mv -- * ..)

Explicação: o comando mv move ficheiros e directórios. O último argumento para mv é o alvo (neste caso o directório um passo “para cima” na árvore, ..). Os argumentos antes disso são os ficheiros e directórios de origem. O asterisco (*) é um asterisco que corresponde a todos os ficheiros que não começam com um ponto. Os ficheiros que começam com um ponto (dotfiles) são “escondidos”. São combinados utilizando o padrão .[^.]* (ver edição abaixo).

Veja a página de manual que liguei para mais informações sobre mv.


Porquê .[^.]* em vez de .* ?

Como Chris Johnsen aponta correctamente: o padrão .* também corresponde a . e ... Uma vez que não quer (e não pode) movê-los, é melhor utilizar um padrão que corresponda a qualquer nome de ficheiro começando com um ponto exceto esses dois. O padrão .[^.]* faz exactamente isso: corresponde a qualquer nome de ficheiro (1) começando com um ponto (2) seguido de um caractere que é não um ponto (3) seguido de zero ou mais caracteres arbitrários.

Como Paggas pontos , também teríamos de adicionar o padrão .??* a fim de combinar ficheiros que comecem com dois pontos. Ver a sua resposta para uma solução alternativa usando find .

A resposta de Arjan menciona shopt a fim de evitar todos aqueles problemas com ficheiros de pontos. Mas depois há ainda o problema com ficheiros que começam com um traço. E requer três comandos. Ainda assim, gosto da ideia. Proponho usá-la desta forma:

0x1&

Isto executa shopt numa subcapa (portanto não é necessária uma segunda chamada para shopt) e utiliza -- para que os ficheiros que começam com um traço não sejam interpretados como argumentos para mv.

45
45
45
2009-10-28 20:19:07 +0000

Resposta curta: usar

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

Resposta longa:

O comando

mv * .* ..

não funcionará uma vez que .* pode corresponder a . e ... Mas o comando

mv * .[^.]* ..

também não funcionará, uma vez que .[^.]* não combinará, por exemplo, ..filename! Em vez disso, o que eu faço é

mv * .[^.] .??* ..

que combinará com tudo excepto . e ... * corresponderá a tudo o que não comece com um ., .[^.] corresponderá a todos os nomes de ficheiros de 2 caracteres começando com um ponto excepto .., e .??* corresponderá a todos os nomes de ficheiros começando com um ponto com pelo menos 3 caracteres.

Melhor ainda, poderá usar

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

o que evita os feios hacks do globo em mv * .[^.] .??* ..!

14
14
14
2009-10-28 20:52:27 +0000

Só por uma questão de exaustividade, também se pode dizer ao Bash shell para incluir ficheiros escondidos, usando shopt :

shopt -s dotglob
mv -- * ..
shopt -u dotglob
8
8
8
2011-08-02 20:46:48 +0000

O mv não tem a funcionalidade de mover ficheiros escondidos quando usa * - então porque não usar cópia em vez disso?

cp -rf . ..

rm -rf *

Não é necessário entrar em soluções complexas de dotglobbing e utilizar comandos de procura.

7
7
7
2013-01-20 11:47:53 +0000
rsync -a --remove-source-files . ..

rsync é uma ferramenta de cópia de ficheiros extremamente poderosa, geralmente utilizada para efectuar backups e espelhos remotos incrementais eficientes.

Com o comando acima, estamos a dizer a rsync para copiar o conteúdo de . para ..

A opção -a permite a repetição em . subdirectórios e permite algumas outras opções comuns.

A comutação --remove-source-files diz ao rsync para remover os ficheiros fonte após uma cópia bem sucedida, ou seja, faz com que o rsync se comporte de forma semelhante ao comando mv.

2
2
2
2011-08-12 08:12:49 +0000

Este comando minimizado funciona na maioria das conchas modernas:

\mv -- {,.{[^.],??}}* ..

Caso contrário, é uma solução portátil:

\mv -- * .[^.] .??* ..

Faatures:

  1. \ Impede que os pseudónimos alterem a mv de forma indesejável.

  2. – impede que nomes de ficheiros contendo hífenes principais (-xyz) sejam interpretados como argumentos de linha de comando.

  3. .[^.] corresponde a todos os nomes de ficheiros de dois caracteres começando por … excepto …

  4. .??^* corresponde a todos os outros nomes de ficheiros de três caracteres ou mais.

Aplicações ingénuas:

  1. Os seguintes salta nomes de ficheiros UNIX escondidos, aqueles que começam com . (.bashrc).

  2. Os seguintes correspondem … que repetidamente tentam mover todos os directórios eventualmente de volta para / para … do directório de trabalho actual ($PWD ou pwd). Nunca usar.

2
2
2
2009-10-28 18:59:46 +0000

Em última análise, tentar mv . falhará porque mv não será capaz de desvincular o directório em que se encontra actualmente. Poderá mv * .. para mover os ficheiros no cwd.

2
2
2
2013-10-22 22:24:11 +0000

É mais correcto utilizar o padrão * .[!.] .??* do que * .[^.] .??* uma vez que o primeiro também funcionará com conchas mais antigas como a ksh88:

mv -- * .[!.] .??* ..
  • -- previne problemas quando se tem um nome de ficheiro que começa com -
  • * corresponde a todos os nomes de ficheiro que não começam com um .
  • não há nenhum nome de ficheiro de caracteres que comece com um . que pode/deve mover
  • .[!.] corresponde aos nomes dos ficheiros de dois caracteres que começam com um .
  • .??* corresponde aos nomes dos ficheiros de três caracteres (ou mais longos) que começam com um .

Com ksh88, o padrão do nome do ficheiro .[^.] irá de facto corresponder aos nomes do ficheiro .. (que sempre existe) e .^ (que provavelmente não existe), tendo um efeito oposto ao desejado.

2
2
2
2009-10-28 19:47:28 +0000
mv * .??* ../.

* recebe todos os ficheiros não pontos. .??* recebe todos os ficheiros . com pelo menos três bytes de comprimento, o que funciona para todos os legítimos. Tudo o que lhe sobrar provavelmente quer rm em vez de mv de qualquer forma.

O ../. não oferece quaisquer benefícios directos sobre .. mas ao fazer uma mudança para directório é um hábito muito bom de se entrar, porque falhará, como quiser, se houver algo de errado com o caminho. Por exemplo, mv xyz bletch, onde você pense bletch é um directório, pode ser mais seguro com mv xyz bletch/..

0
0
0
2014-05-12 23:08:11 +0000

Encontrar e trabalhar também o grep work. Este tipo de estrutura pode ser útil se quiser seleccionar ficheiros com critérios mais complicados, modificando o find e o grep.

find -maxdepth 1 | egrep '^./.' # Returns all files

mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
0
0
0
2014-08-06 16:37:16 +0000

Acho que a solução mais fácil para mover todos os ficheiros para a sua sede seria

mv "`ls`" ../

ou, se houver ficheiros/directórios ocultos

utilizar:

mv "`ls -a`" ../ 2>/dev/null

Além disso, digamos que se pretende mover o conteúdo de alguma pasta para uma das suas pastas internas tony(digamos)

utilização:

mv "`ls -a`" /tony 2>/dev/null

Nota:

"`ls -a`"

Para mover os ficheiros que têm espaços.

2>/dev/null

É para suprimir o aviso/erro porque ls -a imprimiria também a pasta . e .. e não se pode movê-los ou copiá-los. Assim, para essas pastas mostrará erro (se não usarmos 2>/dev/null) que não as pode mover e o resto será movido bastante confortavelmente.

Melhor evitar ls -a se não houver ficheiros escondidos e usar apenas ls.