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.
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.
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)
Usando grep
:
#!/bin/bash
for file in ./KILN_SDUS51_*; do
dir="$(grep -Po "^.*_.*_\K.*(?=ILN)" <<<"$file")"
mkdir "$dir" && mv "$file" "$dir"
done