Criando uma pasta baseada em uma parte de um nome de arquivo

3

Eu tenho vários arquivos com nomes como:

KILN_SDUS51_N0SILN_201203020003
KILN_SDUS51_N0QILN_201203020003
KILN_SDUS51_N0RILN_201203020003

Eu preciso arquivar todos eles em pastas com base nos três caracteres entre _ e ILN (por exemplo, N0S , N0Q , N0R ).

Eu tenho tentado escrever um script bash para fazer isso, mas a maioria dos exemplos similares que eu encontrei lidam com o uso do parâmetro f%, que não parece aplicável neste caso.

    
por WxPilot 05.05.2015 / 17:17

3 respostas

7

Algo como isso deve ser feito:

for file in ./*_???ILN*; do
    dir=${file%ILN*}
    dir=${dir##*_}
    mkdir -p "./$dir" &&
    mv -iv "$file" "./$dir"
done

Veja FAQ 100 para mais informações sobre manipulações de strings no bash.

    
por geirha 05.05.2015 / 17:21
0

Em python:

#!/usr/bin/env python3
import os
import shutil

dr = sys.argv[1]; files = os.listdir(dr)
for f in [f for f in files if os.path.isfile(dr+"/"+f)]:
    folder = dr+"/"+f.split("_")[2].replace("ILN", "")
    if not os.path.exists(folder):
        os.makedirs(folder)
    shutil.move(dr+"/"+f, folder+"/"+f)

Copie-o para um arquivo vazio
Execute-o por:

python3 <script> <directory>

Isto irá criar a (sub) pasta (s), se necessário, mover os arquivos para a (s) pasta (s)

    
por Jacob Vlijm 05.05.2015 / 17:42
0

Usando grep :

#!/bin/bash
for file in ./KILN_SDUS51_*; do
    dir="$(grep -Po "^.*_.*_\K.*(?=ILN)" <<<"$file")"
    mkdir "$dir" && mv "$file" "$dir"
done
    
por heemayl 05.05.2015 / 18:43

Tags