Bash - move arquivos para pastas numeradas oneliner

2

Eu posso criar várias pastas numeradas de uma só vez, assim:

mkdir Season\ {1,2,3,4,5}

Existe uma maneira de executar os seguintes comandos em um oneliner (sem um loop for):

mv 01.* Season\ 1
mv 02.* Season\ 2
mv 03.* Season\ 3
mv 04.* Season\ 4
mv 05.* Season\ 5

Pontos de bônus se houver uma maneira ZSH de fazê-lo.

    
por mafrosis 04.07.2017 / 07:32

3 respostas

3

com zsh :

autoload zmv # best in ~/.zshrc
zmv -n '(<1-5>).*' 'Season $(($1))'

(remova o -n quando feliz)

Observe que ele chama um mv por arquivo, portanto, seria menos eficiente do que os comandos 5 mv da sua pergunta (a menos que você faça um zmodload zsh/files antes para obter um mv incorporado).

Uma perl rename alternativa:

rename -n '$_="Season $1/$_" if /0*(\d+)/' 0[1-5].*

(remova -n quando estiver satisfeito)

Observe que rename chama a chamada de sistema rename() , portanto isso só funciona para mover arquivos dentro do mesmo sistema de arquivos (enquanto mv recorrerá a copiar + desvincular ao mover arquivos pelos limites do sistema de arquivos). p>

Com mmv (a movimentação pelo limite FS é suportada, mas, em seguida, observe que nem todos os atributos serão preservados e, para os links simbólicos, é criada uma cópia do arquivo de destino):

mmv -n '0[0-9].*' 'Season #1/'

(remova -n quando estiver satisfeito)

    
por 04.07.2017 / 08:02
1

Você pode usar o printf, xargs combo:

O printf alimenta os números de 1 a 5, um por vez -n 1 , o número atual é congelado em {} e, em seguida, passado para o sh em sua linha de comando. O argumento é então usado para construir o comando mv apropriado.

printf '%d\n' {1..5} | xargs -n 1 -I {} sh -c 'mv "0$1".* "Season $1"' {} {}
    
por 04.07.2017 / 10:44
0

Aqui está uma solução bash, enquanto o loop passa por todas as temporadas e copia os arquivos para as pastas apropriadas.

season=0; max_season=5; while (( ((season++)) < ((max_season)) )); do mv 0${season}.* Season\ ${season}; done
    
por 04.07.2017 / 07:56

Tags