Como posso mover um diretório (e todos os sub-arquivos / diretórios), mas mover itens em ordem alfabética?

1

Quando executo o seguinte:

mv -v foo /mnt/bar

O diretório foo e todos os seus sub-conteúdos são movidos para o diretório /mnt/bar . A ordem em que os arquivos são movidos parece ser a ordem diretório ( ls -U ).

Existe uma boa maneira de executar essa mesma operação, mas garantir que os subarquivos / diretórios de foo sejam movidos em ordem alfabética?

Eu percebo que posso usar find -exec mv para iterar os sub-conteúdos em ordem alfabética, mas isso requer uma ginástica irritante para manter a mesma estrutura de subdiretórios no alvo. Eu estava esperando por um sinalizador no GNU mv , mas a página man mostra nada de útil.

    
por joelittlejohn 05.08.2018 / 22:51

2 respostas

2

$ \ls foo | xargs -I% mv -v foo/% bar
'foo/one' -> 'bar/one'
'foo/sie' -> 'bar/sie'
'foo/two' -> 'bar/two'
'foo/uve' -> 'bar/uve'
'foo/wox' -> 'bar/wox'
'foo/zanzibar' -> 'bar/zanzibar' 
  1. Use ls para listar itens em ordem alfabética. Para garantir que você esteja executando o ls puro (sem caracteres adicionais adicionados por um alias escondido em seu .bashrc ou .bash_aliases), execute o comando como \ls .
  2. Enviar saída de ls para xargs
  3. Dê a cada item um nome de variável com a variável -I (isto apenas lhe dá algo para "ver" no seu comando mv )
  4. Mova seu item (chamado % ) de seu local em foo para o novo destino.
por 05.08.2018 / 23:31
1

Com a implementação de zsh e pax suportando -0 :

printf '%s
a
a/b
a/b.c
a/b/c
' foo foo/**/*(D) | pax -0rwdv /mnt/bar/ && rm -rf foo

Essas globs recursivas são classificadas lexicalmente (usando a ordem de intercalação da localidade) em cada nível. a antes de a/a antes de a/b antes de b ...

Observe que não é o mesmo que find foo -print0 | sort -z , que classifica os caminhos como um todo e, por exemplo, classificaria:

a
a/b
a/b/c
a/b.c

Nessa ordem na localidade C, em vez de:

printf '%s
a
a/b
a/b.c
a/b/c
' foo foo/**/*(D) | pax -0rwdv /mnt/bar/ && rm -rf foo

em zsh globs.

    
por 05.08.2018 / 23:55

Tags