Lの範囲は1から10、Kの範囲は0.00から49.80のLposK.datというファイルが2500個あります。同じKを持つアイテムをフォルダに移動する必要があります。私は次の方法を使ってこれをしました。
find . -name '*posK.dat' -exec mv {} ~/destination/K \;
ただし、手動でK値を変更してそれを数回繰り返す必要があります。これを行うスクリプトを書くために、findコマンドとmvコマンドでループインデックス(forループなど)を使用する方法があるかどうか疑問に思います。
ベストアンサー1
K
からインポートするには、LposK.dat
文字列がある場合は、$name
次のことができます。
k=${name%.dat} # remove ".dat" suffix
k=${k##*pos} # remove everything up to end of (the last) "pos"
$name
これは後で。some/path/LposK.dat
some/path
pos
find
ファイルの移動:
k=${name%.dat}
k=${k##*pos}
dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest" # only move if mkdir did not fail
そして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 {} +
これにより、sh -c
内部スクリプトに複数のパス名が引数として提供され、スクリプトはこれらのパス名を繰り返して各パスを$HOME/destination
.
関連:
ファイルが単一のサブディレクトリ(現在のディレクトリ)にある場合は、これを行うことなくこれを簡単に実行できます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