2010-06-08 108 views
4

我有一堆日志文件,我必须删除一些小尺寸的文件,这些文件是创建的错误文件。 (63字节)。 我只需要复制那些有数据的文件。删除一定大小的文件

回答

18

Shell(linux);

find . -type f -size 63c -delete 

会遍历子目录(除非你告诉它,否则)

+0

〜unutbu添加了一个目录是可能的,但不是必需的(默认为工作目录),尽管可以给出多条路径的说明:'find ./foo/ bar ./foz ../../baz -type f'会一次搜索所有3个目录。 – Wrikken 2010-06-08 00:38:21

+4

@Wrikken:并非所有版本的find都默认为当前目录。最好明确指定目录,以避免以后出现意外失败的命令。 – 2010-06-08 00:47:46

+2

啊?我不能问哪个版本/平台?并不是说明确有什么问题,特别是在删除时,只是好奇而已。 – Wrikken 2010-06-08 00:53:25

10

既然你用“蟒蛇”标记你的问题在这里是你如何能在语言做到这一点:

target_size = 63 
import os 
for dirpath, dirs, files in os.walk('.'): 
    for file in files: 
     path = os.path.join(dirpath, file) 
     if os.stat(path).st_size == target_size: 
      os.remove(path) 
5

Perl的一个班轮是

perl -e 'unlink grep {-s == 63} glob "*"' 

虽然,测试它会是一个好主意如果你想走路整个目录树

perl -le 'print for grep {-s == 63} glob "*"' 

,您将需要一个不同的版本:运行之前做

#find all files in the current hierarchy that are 63 bytes long. 
perl -MFile::Find=find -le 'find sub {print $File::Find::name if -s == 63}, "."' 

#delete all files in the current hierarchy that 63 bytes long 
perl -MFile::Find=find -e 'find sub {unlink if -s == 63}, "."' 

我使用需要$File::Find::name在发现版本等你拿整路径,取消链接版本不需要它,因为File::Find将目录切换到每个目标目录,并将$_设置为文件名(-sunlink如何获取文件名)。您可能还想查看grepglob

相关问题