通过子文件夹分发数千个文件

通过子文件夹分发数千个文件

我有一个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

相关内容