想在linux上批量删除文件

麻美学姐 发布于 2015/06/04 14:45
阅读 438
收藏 0

某文件夹里面有一批文件,文件名的前六位,前6位都是数字,后面的是一大串字符串,这是文件名,文件名。然后现在需要删除这些文件里面文件名前6位数字小于140414的所有文件,然而我并不熟linux,求赐教。文件挺多的,300多万条数据。

加载中
0
PYPlus
PYPlus
#!/bin/bash

for i in `ls|grep '^[0-9]\{6\}.*'`
do
    s=${i:0:6}
    if [ "$s" -lt "140414" ]
    then
        rm $i
    fi
done


你可以把上面的 rm $i更改为 echo >> filename
重定向到文件中 然后编辑文件查看内容是不是正确的. 正确了

cat filename|xargs rm 这样就很安全了

麻美学姐
麻美学姐
我先这样写了,然后等老大来,不想携程
BigCat47
BigCat47
@PYPlus 81确实是6,我记错了,下标含头不含尾
PYPlus
PYPlus
回复 @_老毛 : 是6 不是5. 我贴上来的代码都是有在机器上跑过的.
0
inuxor
inuxor

笨办法

排序,管道给grep -n ,140414这一行的行号出来了。写个循环小于这一行的删掉

0
bigTreee
bigTreee

知道方法,但是不熟,

基本命令:

ls | grep "1[0-4]0[0-4][0-1][0-4]*" | xargs rm  #大致是这个样子,没做验证

grep参考: http://lq2419.blog.51cto.com/1365130/1238880

Feng_Yu
Feng_Yu
明显不可行,这种正则判断大小本身就会有问题
0
铂金胖子
铂金胖子

如果是删除比140414文件老的暑假文件,可以用find

find ! -newer   140414aaa| xargs rm -f




麻美学姐
麻美学姐
然而我并不敢这样测,还是乖乖用shell慢慢测,我没自信啊,万一错了就携程了。
0
麻美学姐
麻美学姐

我是这样写的,正在测试,然而数据太多,就ls这个命令都要等十几分钟。就想输出几条看看 符不符合。应该 接近600万条。,刚刚有位写shell的小哥。

0
当朝宰相
当朝宰相
你的数字 如果没猜错的应该是日期 使用find查找早于这个日期的即可
0
hawkyoung
hawkyoung
复杂的逻辑可以试试用pyhton一类的脚本语言写,实际删除前只打印出列表不做实际删除,或者将文件移动到一个地方而不是删除
0
eechen
eechen
试试:
#!/usr/bin/php
<?php
# 删除当前文件夹中文件名前6位数字小于140414的文件:
# ./unlink.php -d "/path/to/dir"
# touch 123450cdn 123456abc 523456ii2
$argv = getopt('d:');
if ( !isset($argv['d']) ) exit('缺少路径参数-d'."\n");
if ( !is_dir($argv['d']) ) exit('输入的目录不存在或者不合法'."\n");
chdir($argv['d']);
//echo getcwd()."\n";
$pattern = '[0-9][0-9][0-9][0-9][0-9][0-9]*';
foreach (glob($pattern) as $file) {
    if (is_file($file) && preg_match('/^([0-9]{6})(.*)/', $file, $match) && $match[1]<140414) {
        //print_r($match);
        echo $file."\n";
        //unlink($file);
    }
}
返回顶部
顶部