我有 291 个编号文件(从 001 - 标题开始到 291 - 标题结束),需要移动到单独的目录中。(001 到 021 到文件夹 1,022 到 053 到文件夹 2,每次的文件数量不一定相同)。
我认为我可以用一种令人讨厌的方式来做这件事,像这样:ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh
我几乎确信有更好的方法,那么它会是什么呢?
编辑:这样就可以了,但是我记得……
我不需要使用终端,所以我使用文件管理器来单击并拖动。但问题仍然存在。
答案1
由于您说并不总是正好有 21 个文件,因此您需要手动移动文件,并且为了有效地做到这一点,您可以使用括号扩展:
mv filename{001..21} dir1
mv filename{022..53} dir2
...
答案2
这将按照您描述的方式移动文件(除了第二个范围对于后 21 个文件来说是 022 到 042)。
for ((i = 1; i <= 291; i++))
do
((d = (i - 1) / 21 + 1))
printf -v file 'filename%03d' "$i"
printf -v dir 'dirname%02d' "$d"
[[ -d "$d" ]] && mkdir "$d"
mv "$f" "$d"
done
答案3
我的意思是移动大量文件(比如数万个或一百万个),如果仅使用 {1..20},shell 会抱怨文件列表太长,所以
在嘚,您可以加载动量内置:
setopt extended_glob zmodload
zsh/文件
完成后,您可以使用以下命令:
mv ./somefolder/{1..100000}.txt pathto/yourfolder/
或者如果你正在编写一些 shell 脚本,你可以执行以下操作:
for i in `seq $start $end`;
do mv "prefix${i}suffix.txt" pathto/yourfolder/
done
如果你不使用 zsh,你可以参考https://unix.stackexchange.com/questions/128559/solving-mv-argument-list-too-long