Вы, вероятно, хотели использовать RANDOM% 90
, а не &
. Вот откуда берутся нули (удаление строки 1 - нормально, при следующем запуске строки будут пронумерованы 1 .. 89).
Однако существует проблема: формула может генерировать одно и то же число несколько раз. Чтобы предотвратить это, используйте другой подход: перемешайте числа и выберите первые десять:
shuf -i1-90 -n10 | sed 's/$/d/' | sed -f- input > output
Если вам не нравится sed
, генерирующий сценарий sed
, вы можете использовать ] printf
тоже:
sed -f <( printf %dd\; $(shuf -i1-90 -n10) ) input > output
Para obtener el K
de LposK.dat
, si esa cadena está en $name
, podemos hacer
k=${name%.dat} # remove ".dat" suffix
k=${k##*pos} # remove everything up to end of (the last) "pos"
Esto funcionaría incluso si $name
fuera un nombre de ruta comosome/path/LposK.dat
(e incluso si some/path
contuviera la cadena pos
), lo cual es útil cuando lo conectamos más adelante en find
.
Para mover un archivo:
k=${name%.dat}
k=${k##*pos}
dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest" # only move if mkdir did not fail
Confind
:
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 {} +
Esto le daría al script interno sh -c
una serie de nombres de ruta como argumentos, y el script iteraría sobre estos, moviendo cada uno al subdirectorio correcto de $HOME/destination
.
Relacionado:
Si sus archivos están en un solo subdirectorio (el directorio actual ), entonces puede hacerlo aún más fácilmente sinfind
:
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