Classificar arquivos no enésimo caractere de nome em um gerenciador de arquivos?

4

Eu gostaria de classificar diretórios de arquivos por uma posição especificada no nome do arquivo usando um gerenciador de arquivos "gráfico".

Eu tenho muitos arquivos desse tipo (por exemplo):

0001_oeirnglhk.ext
0002_gkggkcxiuv.ext
0003_xcvxemrn.ext
0004_tteytzpsiogut.ext
0005_sdfdtyeienvf.ext
...
0347_bwvoxciurnsa.ext
     ↑
     └ sort starts here

Eu gostaria que a ordenação começasse no Col. 5, que é o primeiro caractere "alfa" dessas sequências. Meu objetivo é examinar as correspondências de classificação alfa (ou fechar correspondências), mantendo o prefixo numérico e, em seguida, decidir sobre possíveis intervenções manuais. Tentei fazer isso despejando os nomes em um arquivo de texto e, em seguida, classificando os nomes dos arquivos, mas isso se tornou muito complicado na fase de "intervenções", portanto, a busca por uma solução "gui".

Eu cutuquei isso no PCManFM, Nautilus, Nemo, Thunar e Double Commander, sem sucesso. Poderia haver um plug-in, extensão ou outro aplicativo que faria isso?

Embora meu ideal seja obter uma solução "gui", se houver soluções viáveis no terminal, ficaria muito grato por saber disso também. Por exemplo, se o prefixo numérico puder ser movido temporariamente e restaurado depois que as manipulações de arquivo forem concluídas, isso também funcionaria para mim.

Atualização : Embora a solução pura (e aceita!) do @terdon me permitiu lidar eficazmente com essa tarefa em particular, ainda seria bom saber de um gerenciador de arquivos gráfico que classificaria em uma tarefa. "coluna" arbitrária de nomes de arquivos de um diretório.

    
por Dɑvïd 19.12.2016 / 20:11

1 resposta

2

Uma maneira de fazer isso seria renomear seus arquivos para torná-los mais fáceis de classificar usando as ferramentas da GUI. Para testar isso, criei alguns arquivos com prefixos numéricos crescentes e nomes aleatórios:

for i in {001..005} {150..155}; do 
    n=$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c 10); 
    touch $i"_"$n.ext; 
done

Isso criou os seguintes arquivos no meu sistema:

$ ls
001_zxUBrPQEEt.ext  003_crMQ1lLrPA.ext  005_t3gf-X2N82.ext  
151_aKDwJu7phP.ext  153_SSqGdDLOmO.ext  155_mlnSjEGdCF.ext
002_cmAdbTcm0L.ext  004_-39-uI6G9e.ext  150_Vft6mVa5LN.ext
152_5QNPNYdqDj.ext  154_A3EQG1_idu.ext

Para classificá-los como você deseja, deve ser suficiente mover o prefixo numérico para o final do nome do arquivo. Você pode fazer isso usando o seguinte comando rename (para testar a mudança de nome sem realmente modificar nenhum nome, use -n em vez de -v ):

$ rename -v  's/^(.+?)_(.*)/_/' *
001_zxUBrPQEEt.ext -> zxUBrPQEEt.ext_001
002_cmAdbTcm0L.ext -> cmAdbTcm0L.ext_002
003_crMQ1lLrPA.ext -> crMQ1lLrPA.ext_003
004_-39-uI6G9e.ext -> -39-uI6G9e.ext_004
005_t3gf-X2N82.ext -> t3gf-X2N82.ext_005
150_Vft6mVa5LN.ext -> Vft6mVa5LN.ext_150
151_aKDwJu7phP.ext -> aKDwJu7phP.ext_151
152_5QNPNYdqDj.ext -> 5QNPNYdqDj.ext_152
153_SSqGdDLOmO.ext -> SSqGdDLOmO.ext_153
154_A3EQG1_idu.ext -> A3EQG1_idu.ext_154
155_mlnSjEGdCF.ext -> mlnSjEGdCF.ext_155

O comando rename essencialmente lê Perl. Aqui, estamos dando a ele um operador de substituição ( s/original/replacement/ ) que será aplicado a cada nome de arquivo e renomeá-lo para o resultado do operador mencionado. A regex usada corresponderá a tudo, desde o início do nome do arquivo ( ^ ) até o primeiro _ ( (.*?)_ ). O ? torna a correspondência não-gulosa, forçando-a a encontrar a sequência de correspondência mais curta possível. Os parênteses "capturam" as substrings correspondentes, disponibilizando-as no lado direito do operador. O primeiro padrão capturado será , o segundo e assim por diante. O resultado é que o prefixo numérico ( ) é movido para depois do resto do nome ( ).

Depois de ter executado este comando, você pode abrir o diretório e fazer sua coisa com o editor da GUI. Para inverter e voltar aos nomes originais use:

rename 's/(.*)_(\d+$)/_/' -- *

Aqui, o regex está correspondendo tudo até _ e, em seguida, um ou mais números ( \d+ ) até o final da string ( $ ). O -- no final é uma característica geral de muitos programas de linha de comando e significa o fim das opções. Isso garante que qualquer nome de arquivo que comece com - não seja confundido com uma opção.

    
por terdon 19.12.2016 / 21:00