fdupe 查找重复文件的Perl脚本代码

2014-11-14  来源:本站原创  分类:应用技巧  人气:2 

fdupe 是一个很小的 Perl 脚本,用来检索指定目录并找出其中重复的文件,该脚本是通过文件内容来识别是否重复文件,而非文件名。fdupe 无需其他 Perl 脚本支持,运行速度非常快

图:

fdupe 查找重复文件的Perl脚本代码

#!/usr/bin/perl
#
# fdupe tool - finding duplicate files
#
# $Id: fdupe,v 1.7 2011/10/14 20:11:21 root Exp root $
#
# Source code Copyright (c) 1998,2011 Bernhard Schneider.
# May be used only for non-commercial purposes with
# appropriate acknowledgement of copyright.
#
# FILE :        fdupe
# DESCRIPTION : script finds duplicate Files.
# AUTHOR:       Bernhard Schneider <[email protected]>
# hints, crrections & ideas are welcome
#
# usage: fdupe.pl <path> <path> ...
#        find / -xdev | fdupe.pl
#
# how to select and remove duplicates:
#   redirect output to >file, edit the file and mark lines you
#   wish to move/delete with a preceding dash (-)
#   Use following script to delete marked files:
#   #!/usr/bin/perl -n
#   chomp; unlink if s/^-//;
#
# history:
# 12.05.99 - goto statment replaced with next
# 14.05.99 - minor changes
# 18.05.99 - removed confusing 'for $y'
#            included hash-search
# 20.05.99 - minor changes
# 02.03.00 - some functions rewritten, optimized for speed
# 10.01.01 - hint-fix by Ozzie |ozric at kyuzz.org|
# 05.03.02 - fixed hangups by reading block/char-Devices
# 08.09.11 - skips checking of hard links
# 14.10.11 - accept file names from stdin
#
#use strict; # uncomment for debugging
$|=1;
local (*F1,*F2); my %farray = (); my $statF1;
# ------------------------------
# traverse directories
sub scan ($) {
    my ($dir) = $_[0];
    opendir (DIR, $dir) or die "($dir) $!:[email protected]";
    map {
          (-d) ? scan ($_) : push @{$farray{-s $_}},$_
             unless (-l or -S  or -p or -c or -b);
    } map "$dir/$_", grep !/^\.\.?$/, readdir (DIR); closedir (DIR);
}
# ------------------------------
# get chunk of bytes from a file
sub getchunk ($$) {
  my ($fsize,$pfname) = @_;
  my $chunksize = 32;
  my ($nread,$buff);

  return undef unless open(F1,$$pfname);
  $statF1 = [(stat  F1)[3,1]];
  binmode F1;
  $nread = read (F1,$buff,$chunksize);
  ($nread == $chunksize || $nread == $fsize) ? "$buff" : undef;
}
# ------------------------------
# compare two files
sub mycmp ($) {
  my ($fptr) = $_[0];
  my ($buffa, $buffb);
  my ($nread1,$nread2);
  my $statF2;
  my ($buffsize) = 16*1024;

  return -1 unless (open(F2,"<$$fptr"));

  $statF2 = [(stat  F2)[3,1]];
  return 0
   if ($statF2->[0] > 1 && $statF1->[1] == $statF2->[1]);
  binmode F2;
  seek (F1,0,0);

  do {  $nread1 = read (F1,$buffa,$buffsize);
     $nread2 = read (F2,$buffb,$buffsize);
     if (($nread1 != $nread2) || ($buffa cmp $buffb)) {
         return -1;
        }
  } while ($nread1);

  return 0;
}
# ------------------------------
print "collecting files and sizes ...\n";
if (-t STDIN) {
 $ARGV[0] = '.' unless $ARGV[0]; # use wd if no arguments given
 map scan $_, @ARGV;
} else {
 while (<STDIN>)  {
  s?\r\n]$鞍g;
  push @{$farray{-s $_}},$_
   unless (-l or -S  or -p or -c or -b);
 }
}
print "now comparing ...\n";
for my $fsize (reverse sort {$a <=> $b} keys %farray) {
  my ($i,$fptr,$fref,$pnum,%dupes,%index,$chunk);
  # skip files with unique file size
  next if $#{$farray{$fsize}} == 0; 

  $pnum  = 0;
  %dupes = %index = ();

  nx:
  for (my $nx=0;$nx<=$#{$farray{$fsize}};$nx++) # $nx now 1..count of files
  {                                             # with the same size
 $fptr = \$farray{$fsize}[$nx];          # ref to the first file
    $chunk = getchunk $fsize,$fptr;
    if ($pnum) {
   for $i (@{$index{$chunk}}) {
         $fref = ${$dupes{$i}}[0];
      unless (mycmp $fref) {
            # found duplicate, collecting
         push @{$dupes{$i}},$fptr;
   next nx;
      }
   }
    }
    # nothing found, collecting
    push @{$dupes{$pnum}},$fptr;
    push @{$index{$chunk}}, $pnum++;
  }
  # show found dupes for actual size
  for $i (keys %dupes) {
    $#{$dupes{$i}} || next;
    print "\n size: $fsize\n\n";
    for (@{$dupes{$i}}) {
        print $$_,"\n";
    }
  }
}
close F1;
close F2;
相关文章
  • fdupe 查找重复文件的Perl脚本代码 2014-11-14

    fdupe 是一个很小的 Perl 脚本,用来检索指定目录并找出其中重复的文件,该脚本是通过文件内容来识别是否重复文件,而非文件名.fdupe 无需其他 Perl 脚本支持,运行速度非常快 图: #!/usr/bin/perl # # fdupe tool - finding duplicate files # # $Id: fdupe,v 1.7 2011/10/14 20:11:21 root Exp root $ # # Source code Copyright (c) 1998,201

  • [UMU WSH 教程](44) WII 应用实例 - 查找重复文件 2013-05-28

    [UMU WSH 教程](43) WIA 应用实例 - 批量转换图片格式 [UMU WSH 教程](42) FSO 应用实例 - 批量删除文件 UMU WSH 教程代码下载:http://sdrv.ms/ZpPPaS UMU WSH Git:http://git.codeweblog.com/umu618/umu-wsh 数据经常 in-in-out-out 难免产生重复,比如上次 UMU 在 Surface RT 上导入 iPhone4S 和 iPhone5 的照片时发生的悲剧: 把 iPho

  • 在指定目录查找指定后缀文件的shell脚本代码 2014-01-03

    用shell脚本实现的在指定目录查找指定后缀的文件,需要的朋友可以参考下 #!bin/sh # 在指定位置查找指定后缀的文件,包括子目录 # 用法: # findf $1 $2 # 第一个参数为后缀 # 查找指定后缀的文件并打印出来 # link:www.jb51.net # date:2013/2/26 f() { list=`find $2|grep "/.$1/>"` for i in $list do echo $i done } # 打印用法 print() { ech

  • 查找目录下同名但不同后缀名文件的shell脚本代码 2015-03-13

    这个脚本可以实现指定目录下同名但不同后缀名的查找,可以拓展为删除指定的文件的脚本,觉得很实用,分享一下 因为后台录入的同事,上传文件的时候,给文件取了相同的名字,但不同的后缀名,由于文件路径非常深,大概十层左右,每一层又有几十个文件,所以人工找起来非常麻烦,所以写了个脚本,帮他们实现查找指定目录下所有子目录及文件,找出相同文件名,不同后缀的文件,然后,手动保留其中一个. #!/bin/bash #判断一下脚本参数的问题 if [ $# -ne 1 ];then echo "Usage find_

  • perl去除重复内容的脚本代码(重复行+数组重复字段) 2014-05-19

    perl去除重复内容的小脚本,有需要的朋友可以参考下,包括重复行.数据组中重复的字段 假如有这样的一段序列: 1 2 1 2 2 1 1 3 1 4 1 5 4 1 我们需要得到如下的结果: 1 3 1 5 2 1 4 1 那么,请借助以下的perl脚本来实现. 代码一: #!/bin/perl use strict; use warnings; my $filename; my %hash; my @information; my $key1; my $key2; print "please

  • 使用perl清理电脑上重复文件实现代码(续) 2014-02-05

    使有perl搜索电脑上的重复文件并删除,需要的朋友可以参考下 #!/usr/bin/perl use File::DirWalk; use File::Basename; use Data::Dumper; use warnings; use strict; my $dw = new File::DirWalk; my %files; fileparse_set_fstype("MSWin32"); $dw->onFile( sub { my ($file) = @_; push

  • perl实现的两个文件对比并对数据进行筛选的脚本代码 2014-09-17

    对比两个文件并对数据进行筛选的perl脚本,涉及到哈希的应用和perl编程风格的改变.有需要的朋友可以参考下 #!/usr/bin/perl my %scyjm; open (CONTACT,"f:\\perl\\f.txt")||die("can not open the file!"); while (<CONTACT>) { next if /^#/;#if($_=~/^#/的简写 chomp; my @information =split;# m

  • Perl脚本实现递归遍历目录下的文件 2013-10-31

    这篇文章主要介绍了Perl脚本实现递归遍历目录下的文件,本文直接给出实现代码,代码中包含明细注释,需要的朋友可以参考下 #!/usr/bin/perl -w use strict; use File::Spec; local $\ ="\n";#当前模块的每行输出加入换行符 my %options; #目录路径 $options{single_case} = '/home/jiangyu/src/pl/Example'; my @cases; if (-d $options{singl

  • Python和perl实现批量对目录下电子书文件重命名的代码分享 2014-06-27

    这篇文章主要介绍了Python和perl实现批量对目录下电子书文件重命名的代码分享,本文同时给出了Python和perl两种语言的实现代码,需要的朋友可以参考下 经常会遇到下载的文件或电子书,名字中间都包含了一些网址信息,实际使用中由于名字太长不方便,下面的脚本使用正则表达式来对目录下的所有文件重命名: 例如: 修改前:[脚本之家]Mac OS X for Unix Geeks[www.jb51.net].mobi 修改后:Mac OS X for Unix Geeks.mobi python代

  • win2003文件夹权限设置脚本代码 2013-12-19

    win2003文件夹权限设置脚本代码,需要批处理的朋友可以参考下. [/code] @echo off color 0a title windows 2003文件夹权限设置 by ?☆孤影☆? echo. echo. echo. cacls "C:\Windows" /r everyone /e cacls "C:\Documents and Settings" /r everyone /e cacls "C:\Documents and Settings

  • shell脚本中使用iconv实现批量文件转码的代码分享 2014-03-16

    这篇文章主要介绍了shell脚本中使用iconv实现批量文件转码的代码分享,本文提供了2个实现代码和各自使用方法,需要的朋友可以参考下 在开发中,我们经常需要对N多文件编码进行更改,iconv只能对单文件的进行更改,怎么办呢?我们写一个shell脚本来解决这个问题. 例子一:使用shell脚本实现批量转码的操作. #!/bin/sh # convertCodeFilePath=$1 fromCode=$2 toCode=$3 for i in {1..1} do [ -f $convertCod

  • 批量转换目录下文件编码的shell脚本代码 2014-06-29

    分享一例shell脚本,实现可以批量转换目录下的文件编码,很实用的一个小shell,有需要的朋友参考下 一例批量转换目录下文件编码的shell脚本代码. 需求描述: 由于从window转linux过来,很多原来win下的gbk文件需要转换成utf8. 以下脚本仅判断非utf8文件转换成utf8文件,并且默认非utf8文件为gbk,如果文件类型不一致需要修改. 例子: #!/bin/bash # File Name: iconv.sh # Author: wanggy # site: www.jb

  • shell脚本实现拷贝大文件显示百分比的代码分享 2014-08-20

    这篇文章主要介绍了shell脚本实现拷贝大文件显示百分比的代码分享,需要的朋友可以参考下 #!/bin/sh strace -q -eread cp -- "${1}" "${2}" 2>&1 \ | awk '{ count += $NF if (count % 10 == 0) { percent = count / total_size * 100 for (i=0;i<=percent;i++) printf("=")

  • sed删除文件中的一行内容的脚本代码 2014-09-07

    sed删除文件中的一行内容的脚本代码,需要的朋友可以参考下 先来看下原始文件的内容: [email protected] ~]# cat file.txt hello world a:b:c -h -n a:b:c -h -n sed根据条件删除相关的行: 复制代码 代码如下: [[email protected] ~]# sed -i '/a:b:c -h -n/d' file.txt [[email protected] ~]# cat file.txt hello world sed根据条件进行相关内容的替

  • 把文件复制N份的2个Shell脚本代码 2014-11-09

    这篇文章主要介绍了把文件复制N份的2个Shell脚本代码,一般用在需要大量文件测试时使用,需要的朋友可以参考下 测试时需要大量文件,所以写了脚本进行拷贝.有规律的文件名利于引用. #!/bin/sh # file name : batchcp.sh # author: zhouhh # Email: [email protected] # Date : 2008.3.31 echo "input your file name" read FILENAME echo "how

  • perl ping检测功能脚本代码 2014-06-10

    领导有任务,给一批IP列表,ping每一台机器,如果没有响应就发邮件通知,通知的邮件需要分开,不能通知一个列表,得一封一封的通知 我的第一个用于生产环境的perl脚本,虽然不是很优秀,但也迈出了扎实的一步 :) 领导有任务,给一批IP列表,ping每一台机器,如果没有响应就发邮件通知,通知的邮件需要分开,不能通知一个列表,得一封一封的通知. 用到email::send模块,因为需要用到Gmail #!/usr/bin/perl use warnings; use strict; use Emai

  • [Perl]文字/代码批量替换工具 2014-05-08

    Perl脚本batchReplace.pl可以用来批量替换文件中的文字/代码.可在指定目录中查找指定类型的文件,并递归检查子目录:在输出文件时复制输入文件的目录结构. [附件]Win32应用程序batchReplace.exe是由Perl脚本编译产生的可执行程序,不需安装Perl运行环境即可执行. 在命令行中使用 batchReplace.exe[ -i 输入文件路径(或包含文件的目录)][ -o 输出文件位置(文件或目录)][ -c 批量输入文件的扩展名,以"."开始,多个扩展名之间

  • 25个PHP游戏编程脚本代码 2011-06-14

    摘要:本文将与大家分享25个不错PHP游戏编程脚本代码,使大家开心之余工作编程事半功倍! 清单 1.简单的掷骰器 许多游戏和游戏系统都需要骰子.让我们先从简单的部分入手:掷一个六面骰子.实际上,滚动一个六面骰子就是从 1 到 6 之间选择一个随机数字.在 PHP 中,这十分简单:echo rand(1,6);. 在许多情况下,这基本上很简单.但是在处理机率游戏时,我们需要一些更好的实现.PHP 提供了更好的随机数字生成器:mt_rand().在不深入研究两者差别的情况下,可以认为 mt_rand

  • Perl脚本的调试方法 2012-04-01

    Q&A 什么是ActivePerl? ActivePerl是Perl语言的Windows版本,Perl是一种很自由而且功能很强大的编程语言,主要被用作 Web 编程.数据库处理.XML 处理以及系统管理,而且Perl 相当快捷实用. 什么是Dzsoft perl ? Dzsoft perl editor是Perl/CGI 脚本编写.编辑和调试工具.它有着舒适而直观的用户界面,适合于初学者和高级程序员.它简单得有些奇怪,但是它真的是一款强大的工具.它有调试功能,一个舒适的带语法加亮的编辑器,一个语

  • python实现在目录中查找指定文件的方法 2014-01-25

    这篇文章主要介绍了python实现在目录中查找指定文件的方法,通过模糊查找与精确查找两个实例较为详细的阐述了文件查找的方法,是非常实用的技巧,需要的朋友可以参考下 本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 import os from glob import glob #用到了这个模块 def search_file(pattern, search_path=os.environ['PATH'], pathsep=os.p