如何使用 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

相关内容