作者:董雪高 | 来源:互联网 | 2023-05-17 15:29
我有几个文件夹,每个文件夹有15,000到40,000张照片.我希望将每个文件拆分为子文件夹 - 每个文件夹中包含2,000个文件.
有什么快速的方法可以创建我需要的每个文件夹并移动所有文件?
目前我只能找到如何将文件夹中的前x个项目移动到预先存在的目录中.为了在包含20,000个项目的文件夹上使用它...我需要手动创建10个文件夹,并运行命令10次.
ls -1 | sort -n | head -2000| xargs -i mv "{}" /folder/
我尝试将它放入for循环中,但是在使用mkdir正确制作文件夹时遇到了麻烦.即使我解决了这个问题,我还是需要程序只为每个第20个文件创建文件夹(新组的开始).它想为每个文件创建一个新文件夹.
那么......我怎样才能轻松地将大量文件移动到每个文件中任意数量文件的文件夹中?
任何帮助都会......非常......乐于助人!
1> tmp..:
尝试这样的事情:
for i in `seq 1 20`; do mkdir -p "folder$i"; find . -type f -maxdepth 1 | head -n 2000 | xargs -i mv "{}" "folder$i"; done
完整脚本版本:
#!/bin/bash
dir_size=2000
dir_name="folder"
n=$((`find . -maxdepth 1 -type f | wc -l`/$dir_size+1))
for i in `seq 1 $n`;
do
mkdir -p "$dir_name$i";
find . -maxdepth 1 -type f | head -n $dir_size | xargs -i mv "{}" "$dir_name$i"
done
2> nisetama..:
下面的代码假定文件名不包含换行符,空格,制表符,单引号,双引号或反斜杠,并且文件名不以破折号开头。它还假定IFS
尚未更改,因为它使用while read
代替while IFS= read
,并且因为未引用变量。添加setopt shwordsplit
Zsh。
i=1;while read l;do mkdir $i;mv $l $((i++));done<<(ls|xargs -n2000)
下面的代码假定文件名不包含换行符,并且它们不以短划线开头。-n2000
一次接受2000个参数,它{#}
是作业的序号。替换{#}
为'{=$_=sprintf("%04d",$job->seq())=}'
以四位数填充数字。
ls|parallel -n2000 mkdir {#}\;mv {} {#}
下面的命令假定文件名不包含换行符。它使用rename
Aristotle Pagaltzis 的实现,这是rename
Homebrew中的公式,在哪里-p
需要创建目录,在哪里--stdin
需要从STDIN获取路径,在哪里$N
是文件编号。在其他实现中,可以使用$.
或++$::i
代替$N
。
ls|rename --stdin -p 's,^,1+int(($N-1)/2000)."/",e'
使用`ls`会带来很多问题。我对您的示例做了一些修改:`find。-类型f -print0 | parallel -0 -n2000 mkdir“ dir _ {#}” \; mv {}“ dir _ {#}”`。对我来说同样有效。