我有一个A
包含数十万个文件的文件夹。我想将这些文件移动到新的子文件夹S_i
,例如每个文件夹有 100 个文件(最后一个文件夹的文件可能少于 100 个)
换句话说,如果我的文件夹A
有:
file1
file2
...
file1000
我以后会有:
S_1:
file_1
...
file_100
S_2:
file_101
...
file_200
...
在我手动编写 Zsh 脚本来完成此任务(例如使用变量来计算文件数)之前,我想知道是否有任何现成的工具(例如分裂)这将有助于这项任务。
答案1
如果文件名不包含空格:
i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n100)
使用parallel
:
ls|parallel -n100 mkdir {#}\;mv {} {#}
答案2
和zsh
:
autoload zmv
zmv 'file_(<->)' 'S_$((1 + ($1 - 1) / 100))'
如果文件没有编号,但您只想拆分该列表:
n=0; zmv -Q 'file_*(n)' 'S_$((n++/100+1))'
(n)
是切换列表的数字顺序(并且您需要-Q
该通配符限定符)。
每个文件调用一个mv
。您可以通过mv
内置 ( )来提高效率zmodload zsh/files
,或者您可以这样做:
files=(file_*(nN))
for ((n=1; $#files; n++)) {
mv -- $files[1,100] S_$n
files[1,100]=()
}
以上(nN)
是zsh
通配限定符这进一步限定了全球。n
是为了数值排序,N
就是打开nullglob
该 glob 的选项,即当没有匹配项时,将 glob 扩展为空列表。
(有了这个,你甚至可以添加一个,mkdir S_$n
以防这些目录事先不存在)。
答案3
有一个 dirsplit 的 linux 实用程序https://linux.die.net/man/1/dirsplit