mvを使用してループ内の異なる名前を持つ複数のファイルを移動する方法は?

mvを使用してループ内の異なる名前を持つ複数のファイルを移動する方法は?

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.datsome/pathposfind

ファイルの移動:

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

おすすめ記事