alterando a ordem dos arquivos

1

Eu tenho uma série de arquivos nomeados em ordem alfabética (xaa.tif para xdg.tif). Eu preciso inverter a ordem dos nomes de arquivos para que o último arquivo seja processado primeiro em um script. Eu gostaria de renomeá-los adicionando um número no início do nome do arquivo (01xdg.tif para 60xaa.tif).

Como posso fazer isso com um script bash no Linux?

    
por To Do 18.12.2013 / 15:05

3 respostas

1

Como os nomes dos arquivos não contêm caracteres especiais, incluindo espaços, isso pode ser feito facilmente usando ls -r (que é -r para --reverse , não -R para --recursive ).

/tmp/todo$ ls
/tmp/todo$ touch ab bc bd ef
/tmp/todo$ ls
ab  bc  bd  ef
/tmp/todo$ ls -r
ef  bd  bc  ab
/tmp/todo$

Então você pode renomear os arquivos usando algo como:

num=1
for file in $(ls -r)
do
    mv $file "$(seq --format='%02g' $num $num)${file}"
    num=$(( $num + 1 ))
done

Isso usa seq para formatar o número para usar dois dígitos ( 2 ) preenchidos com zero à esquerda ( %0 ) sem casas decimais ( g ) para uma string de formato total de %02g . Há provavelmente uma maneira mais eficiente de fazer isso, mas com tão poucos arquivos, eu não me incomodaria com micro-otimização.

Isso simplesmente itera a lista de arquivos (na ordem inversa), renomeia cada um por vez e incrementa um contador para cada renomeação.

O resultado final é:

/tmp/todo$ ls
01ef  02bd  03bc  04ab
/tmp/todo$

Note que o acima pode muito bem desmoronar se os nomes dos arquivos tiverem algo mais incomum neles do que simples a-z, pontos e dígitos para começar. Particularmente, não sei ao certo o quão bem ele vai lidar com espaços.

    
por 18.12.2013 / 16:03
0

Você pode usar o comando de classificação do usuário no Linux

digamos que o diretório contenha os seguintes arquivos

# ll /tmp/sort_folder
total 0
-rw-r--r-- 1 root root 0 Dec 18 19:51 a
-rw-r--r-- 1 root root 0 Dec 18 19:51 b
-rw-r--r-- 1 root root 0 Dec 18 19:51 v

O comando sort lhe dará saída como abaixo (por padrão, crescente)

# ll /tmp/sort_folder | sort
-rw-r--r-- 1 root root 0 Dec 18 19:51 a
-rw-r--r-- 1 root root 0 Dec 18 19:51 b
-rw-r--r-- 1 root root 0 Dec 18 19:51 v

Para inverter a ordenação (decrescente), você pode nós opção -r (inversa) para o comando sort

# ll /tmp/sort_folder | sort -r
total 0
-rw-r--r-- 1 root root 0 Dec 18 19:51 v
-rw-r--r-- 1 root root 0 Dec 18 19:51 b
-rw-r--r-- 1 root root 0 Dec 18 19:51 a
    
por 18.12.2013 / 15:29
0

Isso deve funcionar:

#!/bin/bash
#
Count=0
ls -r | while read FileName
do
    FmtCount='printf %02d $Count'
    mv -i $FileName $FmtCount$FileName
    Count=$((Count+1))
done

Aqui está a explicação:

  • ls -r lista os arquivos na ordem inversa
  • printf formata a contagem em dois dígitos preenchidos com zero
  • Os backquotes transformam a saída em uma string

Eu acho que o resto é auto-explicativo, mas se não, por favor, pergunte

    
por 18.12.2013 / 16:03