如何使用 mv 循環移動多個具有不同名稱的檔案?

如何使用 mv 循環移動多個具有不同名稱的檔案?

我有 2500 個檔案名稱 LposK.dat,L 範圍從 1 到 10,K 範圍從 0.00 到 49.80。我需要將具有相同 K 的那些移動到資料夾中。我設法使用以下方法來做到這一點:

find . -name '*posK.dat' -exec mv {} ~/destination/K \;

但我必須手動更改 K 的值並重複多次。我想知道是否有任何方法可以在 find 和 mv 命令中使用循環索引(例如:for 循環),以便我可以編寫腳本來執行此操作。

答案1

要取得Kfrom 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

相關內容