Como mover todos os arquivos da pasta atual para a subpasta?

70

Estou no caminho:

/myuser/downloads/

E eu crio uma subpasta:

/myuser/downloads/new

Agora, quero mover todos os arquivos e pastas / subpastas da pasta de downloads para a subpasta.

como posso fazer isso?

Eu tentei:

mv -R *.* new/

Mas o movimento não aceita a opção -R que parece.

Blankman
fonte
4
Você não precisa de -R. No mv * newentanto, ele lamentará "não pode mudar de novo para novo" ou algo semelhante. Talvez mv -i * newvocê evite substituições.

Respostas:

101

O comando

mv !(new) new

deve fazer o truque. Se não funcionar, execute shopt -s extglobprimeiro.

Para também mover arquivos / diretórios ocultos (que começam com um ponto), execute também shopt -s dotglobprimeiro.
Entao, para resumir:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(é sempre melhor desabilitar dotglobpara evitar surpresas ruins).

enzotib
fonte
5
você pode mencionar qual é o significado !(something)?
#
2
@adeer que está apenas dizendo que não (algo). Em outras palavras, copie tudo, mas não algo. Claro como lama?
usar o seguinte
4
muito. você sabe o equivalente a zsh?
11446 Adeerlike em 7/03
11
Eu não entendi, por exemplo, o que se eu tentar mover o conteúdo da pasta devpara o meu local atual, tenho que executar mv !(dev) dev? Eu recebo-bash: !: event not found
Preto
5
@adeer muito parecido. setopt extendedglobpara definir o modo glob estendido no zsh. ^é o símbolo de exclusão, o mv ^new newque faria o truque. em seguida, para ver todas as opções definidas em zsh você pode usar setopte para desativar o modo glob estendida você pode fazerunsetopt extendedglob
Mr. T
10

Encontrei algo parecido com isto, mas é um pouco mais simples de entender, e pode funcionar bem para você também:

ls | grep -v new | xargs mv -t new

Adicionando uma explicação para a solução acima:

Nas páginas do manual:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

Explicado pela etapa:

  • ls listará os arquivos no diretório atual
  • grep -v new retornará canalizado para que não seja novo
  • xargs mv -t newmoverá os arquivos canalizados para ele grep -vpara o diretório de destino
lockwobr
fonte
Eu tentei este método, mas eu estou começando: mv: illegal option -- t. Isso é porque eu estou usando zsh?
ConstantFun
@ConstantFun Poderia ser o zsh, mas eu acho que é a sua implementação mv, (o que significa que a sua versão do mv é diferente do que eu estava usando) do que você está usando? Acredito que, quando escrevi esta resposta, estava centosusando a distribuição Linux bash.
lockwobr 19/02
2
Apenas testando isso no osx e recebo o mesmo erro, mv: illegal option -- tporque o mv do osx não tem uma -topção.
lockwobr 19/02
11
(Eu não tentei isso e não pretendo fazê-lo.) Este link apple.stackexchange.com/questions/69223/… mostra como instalar o gnucore, o que deve ajudá-lo a obter utilitários de gnu core cli, osx é fornecido com bsd Ferramentas CLI que são diferentes das que acompanham o Linux.
lockwobr 19/02
Estou no OSX rodando zsh, então provavelmente é o SO então ..? Obrigado por esclarecer!
ConstantFun
7

Ideia simples. Supondo que você está em / myuser , mudar o nome de downloads de novo , criar um novo download diretório, em seguida, mover novo para ele.

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.
jpezz
fonte
1

Se você deseja mover todos os arquivos de uma pasta para uma de suas subpastas, use o seguinte comando:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

Ele encontrará todos os arquivos e depois os moverá para sua subpasta.

@ waltinator: adicionado -type d -name 'new' -prunepara impedir a travessia de /myuser/downloads/new.

demian
fonte
Eu criei um subdiretório chamado newe tentei este comando, eu recebo mv: missing file operandeTry 'mv --help' for more information
mook765 13/10
1

Você pode tentar esse processo alternativo - permaneça no caminho

/myuser/downloads/

mas, em vez de primeiro criar o /myuser/downloads/new/diretório, crie uma pasta no /myuser/diretório, com o comando mkdir ../new, mova todos os arquivos downloadspara newe finalmente newentre downloads. Você pode fazer isso em uma linha, enquanto estiver no /myuser/downloads/caminho, com o comando:

mkdir ../new && mv * ../new && mv ../new ../downloads

Nesse caso, você não precisa se preocupar com nenhum tipo de "filtragem" de arquivos / pastas, pois newestá no mesmo nível do caminho que downloadsvocê, basta mover tudo downloadspara dentro newe depois fazer o newdownload`.

No entanto, se você já tiver a subpasta newcriada e não quiser criar outra, não se preocupe - basta alterar o mkdircomando no lado esquerdo do primeiro &&no comando mostrado acima para um mvcomando, pressionando newa tecla caminho; em outras palavras, enquanto você ainda estiver em /myuser/downloads/, você pode mudar mkdir ../newpara mv new ... Em seguida, a subpasta new[no caminho /myuser/downloads/new/] é pressionada /myuser/new/, no mesmo nível que /myuser/downloads/, e você pode executar o restante do comando, conforme mostrado acima. Todos juntos, a partir do caminho /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

e, como você deseja "mover todos os arquivos e pastas / subpastas da pasta de downloads para a subpasta [ new]", está pronto! Se você quisesse mover apenas arquivos (ou apenas pastas ou [inserir mais movimentos granulares de objetos]), seria necessário usar outros comandos que podem "filtrar" objetos, como grep. Os comandos escritos acima são suficientes para seus propósitos, no entanto.

adamcatto
fonte