Mover um intervalo de arquivos numerados?


14

Eu tenho 291 arquivos numerados (começando em 001 - title e terminando em 291 - title) que precisam ser movidos para diretórios separados. (001 a 021 na pasta 1, 022 a 053 na pasta 2, eles não são necessariamente o mesmo número de arquivos de cada vez).

Imaginei que poderia fazê-lo de uma maneira nojenta como esta: ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

Tenho quase certeza de que existe uma maneira melhor, então qual seria?

EDIT: Então isso teria funcionado bem, mas eu lembrei ...

Como não estou preso a um terminal, usei um gerenciador de arquivos para clicar e arrastar. A questão ainda permanece.


1
Você quer 21 subpastas na pasta 1 e 22 pastas na pasta 2?
Daniel Beck

Você já revisou o unix.SE? Há uma boa discussão sobre isso aqui: unix.stackexchange.com/questions/12976/…
chrisjlee

@DanielBeck não, quero que os arquivos sejam movidos para cada pasta. Há um número diferente de arquivos indo para cada pasta.
Rob

@ ChrisJ.Lee Isso é bem parecido com o que eu estava fazendo / já fiz antes, eu gosto. Como os arquivos correspondem a outros arquivos em outra pasta, pude ls -l | grep ^- | wc -lobter o número de linhas.
Rob

1
@Rob direito. Ainda assim, número diferente de arquivos em cada diretório. Automatizar isso (incluindo regras) é mais esforço do que fazer você mesmo algumas vezes.
Daniel Beck

Respostas:


25

Como você disse que nem sempre são exatamente 21 arquivos, é necessário movê-los manualmente e, para fazer isso com eficiência, você pode usar a expansão de chave :

mv filename{001..21} dir1
mv filename{022..53} dir2
...

Parece que poderia funcionar, eu vou experimentar.
Rob

1
Isso funciona perfeitamente, se você adicionar um curinga após os colchetes. Isso é exatamente o que eu precisava.
Rob

2
Se o número estiver no meio do nome, você pode escrever file{001..21}name, não precisa usar curinga. De qualquer forma, feliz que funcionou para você.
drrlvn

1

Isso moverá os arquivos como você descreveu (exceto que o segundo intervalo seria de 022 a 042 para os segundos 21 arquivos).

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done

Nem sempre são 21 arquivos, mas obrigado.
Rob

0

O que quero dizer é mover muitos arquivos (como dez mil ou um milhão), o shell irá reclamar da lista de arquivos por muito tempo se você usar {1..20}, então

No zsh , você pode carregar o mv builtin:

setopt extended_glob zmodload

zsh / files

Depois de fazer isso, você pode usar o comando como:

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

ou se você estiver escrevendo alguns scripts de shell, poderá fazer algo assim:

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

se você não estiver usando o zsh, consulte /unix/128559/solving-mv-argument-list-too-long


Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada. Qual resposta você está referenciando como a "resposta mais detalhada"?
Ramhound

Isso realmente não responde à pergunta, pois o OP deseja mover arquivos diferentes para diretórios diferentes.
DavidPostill
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.