在Linux中将大型目录拆分为较小的目录

时间:2017-08-29 05:01:11

标签: linux shell unix

我有一个名为application_pdf的大型目录,其中包含93k个文件。我的用例是将目录拆分为3个较小的子目录(与原始大目录不同的位置),每个子目录包含大约30k个文件。 这可以直接从命令行完成。 谢谢!

3 个答案:

答案 0 :(得分:3)

使用bash:

x=("path/to/dir1" "path/to/dir2" "path/to/dir3")
c=0
for f in *
do
    mv "$f" "${x[c]}"
    c=$(( (c+1)%3 ))
done

答案 1 :(得分:0)

这样的事可能有用:

for x in $(ls -1 originPath/*.pdf | head -30000); do
    mv originPath/$x destinationPath/
done

答案 2 :(得分:0)

如果你有 Perl rename命令,你可以这样试试:

rename --dry-run -pe 'my @d=("dirA","dirB","dirC"); $_=$d[$N%3] . "/$_"' *.pdf

如果您不熟悉语法:

  • -p表示创建输出目录,àlamkdir -p
  • -e表示要执行以下Perl代码段
  • $ d [$ N%3]选择数组@d中的一个目录作为$N
  • 提供给代码段的连续递增的计数器rename的函数
  • 通过设置rename
  • 将输出值传回$_

如果看起来不错,请移除--dry-run。请首先使用复制的8-10个文件在小目录上运行,然后在尝试所有93k文件之前进行备份。

<强>测试

touch {0,1,2,3,4,5,6}.pdf

rename --dry-run -pe 'my @d=("dirA","dirB","dirC"); $_=$d[$N%3] . "/$_"' *.pdf
'0.pdf' would be renamed to 'dirB/0.pdf'
'1.pdf' would be renamed to 'dirC/1.pdf'
'2.pdf' would be renamed to 'dirA/2.pdf'
'3.pdf' would be renamed to 'dirB/3.pdf'
'4.pdf' would be renamed to 'dirC/4.pdf'
'5.pdf' would be renamed to 'dirA/5.pdf'
'6.pdf' would be renamed to 'dirB/6.pdf'

更多供我自己参考,但如果您没有 Perl rename命令,则只能在 Perl 中执行此操作:

perl -e 'use File::Copy qw(move);my @d=("dirA","dirB","dirC"); my $N=0; @files = glob("*.pdf"); foreach $f (@files){my $t=$d[$N++%3] . "/$f"; print "Moving $f to $t\n"; move $f,$t}'