Mova todas as subpastas, com exceção de uma, para essa subpasta

0

Eu tenho um diretório chamado temp . Dentro desta pasta, tenho várias subpastas (não sei o número exato). Agora eu crio outra subpasta dentro de temp named Untitled . Agora quero mover todas as outras subpastas dentro de Untitled .

Digamos que eu tenha 3 pastas dentro de temp chamadas a, b, c. Agora eu crio Untitled . Então temp agora contém 4 pastas a, b, c e sem título. Depois de executar a operação, a temperatura conterá apenas a pasta Untitled com Untitled, contendo a, b, c.

Como posso conseguir isso usando o bash?

Minha versão do Bash (no Ubuntu 16.04)

GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
    
por Robur_131 11.11.2018 / 19:05

2 respostas

1

Supondo que você tenha apenas as pastas dentro da pasta principal, a maneira mais simples é de temp (primeiro cd a temp ):

mv * Untitled

Você receberá um erro dizendo:

mv: cannot move 'Untitled' to a subdirectory of itself, 'Untitled/Untitled'

Se isso for um problema para você, você pode usar um loop sobre * e mover cada arquivo um por um, ignorando a subpasta de destino.

$ mkdir a b c
$ target_dir=Untitled
$ mkdir "$target_dir"
$ for f in *; do
if [ "$target_dir" == "$f" ]; then continue; fi; mv "$f" "$target_dir"; done
$ ls
Untitled
$ ls Untitled/
a  b  c

Se houver arquivos que você queira ignorar, adicione a condição dentro do loop antes do comando mv .

    
por 11.11.2018 / 19:24
3

Resumidamente, e sem erros, você poderia usar o globbing estendido do bash para excluir o diretório que você deseja omitir:

shopt -s extglob
mv -- !(Untitled) Untitled

Depois de garantir que a globbing estendida esteja ativada, o comando mv funciona expandindo o primeiro parâmetro ( !(Untitled) ) para todos os arquivos e diretórios no diretório atual exceto para o nome " Sem título". Todos esses arquivos e diretórios são movidos para o diretório Untitled .

Se você quiser mover apenas diretórios do diretório atual para Sem título, adicione um caractere:

shopt -s extglob
mv -- !(Untitled)/ Untitled

... onde o / à direita força o bash a corresponder a um diretório em vez de um arquivo.

Os itens acima omitirão os arquivos de ponto por padrão (como .subdir ). Se você quiser pegá-los também, basta adicionar:

shopt -s dotglob

Para mais informações sobre essas opções de shell, consulte:

por 11.11.2018 / 21:21