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