Bash snippet para mover todos os arquivos em um diretório para esse diretório

9

Eu tenho um diretório com muitos arquivos e diretórios nele. Para arrumar tudo, vou colocar todos esses arquivos em um diretório, então eu faria algo assim:

$ ls | wc -l
123
$ mkdir new_directory
$ mv * ./new_directory

No entanto, isso obviamente não funcionará porque, então, ele tentará mover new_directory para new_directory . Existe alguma maneira simples de fazer o que eu quero em uma linha sem que eu tenha que copiar e colar todos os arquivos e diretórios nesse diretório?

    
por Rory 08.09.2009 / 11:35

9 respostas

13

Seu

O comando
mv * ./new_directory
realmente funcionará; apenas imprimirá um aviso de que não é possível mover o diretório para dentro dele.     
por 08.09.2009 / 12:50
10

Um oneliner rápido e sujo.

mv 'ls -A | grep -v new_directory' ./new_directory
    
por 08.09.2009 / 11:39
8

Se você está apenas procurando os arquivos (ou seja, não diretórios), então

find . -type f -maxdepth 1 -exec mv {} ./new_directory/ \;

é a solução mais portátil. Para velocidade, você deve mover find e xargs, com -print0 e -0, mas somente se você tiver o GNU find e xargs.

    
por 08.09.2009 / 11:42
5

Nas vezes em que tive esse problema, fiz uma das seguintes ações:

$ mkdir ../new-directory
$ mv * ../new-directory/
$ mv ../new-directory .

ou

$ mkdir .new-directory
$ mv * .new-directory/
$ mv .new-directory new-directory

O segundo formulário aproveita o nome de arquivo ignorado que começa com '.'

    
por 08.09.2009 / 22:58
2

e:

cd ..
mv old_dir new_directory
mkdir old_dir
mv new_directory old_dir

IOW, não mova o conteúdo para um novo diretório, mas coloque este diretório dentro de um novo diretório.

    
por 08.09.2009 / 20:43
1

De maneira semelhante a @ Resposta da Rembrane (embora não seja um one-liner):

for FN in *
do
    if [ "<new_dir>" != $FN ] then
        mv $FN <new_dir>
done

Isso deve ser 100% portátil - mesmo que find esteja infelizmente ausente do seu sistema.

    
por 08.09.2009 / 12:09
1

Minhas sugestões: Como afirmado por outros, o

mv * ./new_directory

funcionará e descobrirá que a expansão total é curta o suficiente.

Além disso, você pode experimentar esse que aumenta muito o número de arquivos:

find . -type f -maxdepth 1 | xargs -s100000 echo | xargs -iXXX mv XXX new_directory

Explicação

  1. Listar todos os arquivos.
  2. Agrupe todos os nomes de arquivos em blocos de no máximo 100000 caracteres.
  3. Construa um único comando mv por trecho.
por 08.09.2009 / 13:42
1

Uso:

find -mindepth 1 -maxdepth 1 \! -name new_directory -print0 | \
    xargs -0 -P 100 -I'{}' mv '{}' new_directory

Na página xargs man:

-P max-procs

  Run up to max-procs processes at a time;
    
por 08.09.2009 / 21:08
-1

Para evitar a mensagem de erro e mantê-la simples:

mv *.* ./new_Folder

fará a mesma coisa, mas evita a mensagem de erro (a menos que você tenha pontos nos nomes das pastas).

    
por 01.09.2014 / 14:05

Tags