Para obter o K de LposK.dat , se essa sequência estiver em $name , poderemos fazer
k=${name%.dat} # remove ".dat" suffix
k=${k##*pos} # remove everything up to end of (the last) "pos"
Isso funcionaria mesmo se $name fosse um nome de caminho como some/path/LposK.dat (e mesmo se some/path continha a string pos ), o que é útil quando mais tarde você conectá-lo a find .
Para mover um arquivo:
k=${name%.dat}
k=${k##*pos}
dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest" # only move if mkdir did not fail
com find :
find . -type f -name '*pos*.dat' -exec sh -c '
for name do
k=${name%.dat}
k=${k##*pos}
dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest"
done' sh {} +
Isto daria ao script interno sh -c um número de nomes de caminho como argumentos, e o script iria iterá-los, movendo cada um para o subdiretório correto de $HOME/destination .
Relacionados:
Se os seus arquivos estiverem em um único subdiretório (o diretório atual), você poderá fazer isso ainda mais facilmente sem find :
for name in ./*pos*.dat; do
[ ! -f "$name" ] && continue # skip non-regular files
k=${name%.dat}
k=${k##*pos}
dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest"
done