我有 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
要获取K
from 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