51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Linux如何快速删除目录下大量文件

一、问题描述 {#一、问题描述}

如何删除目录下大量文件【保留指定文件】。

如果某目录下有70000个文件,要快速地删除,并需要保留其中的几个文件,那么该怎么做呢?

二、问题解决 {#二、问题解决}

首先还涉及到另一个问题:如何快速列出这70000个文件?

[root@primary linuxscript]# time ls -l &>/dev/null 
`real	0m0.850s
user	0m0.374s
sys	0m0.475s`

默认ls命令会在内存中对输出的文件进行排序,速度就会变慢。

[root@primary linuxscript]# man ls | grep -w "\-f"
       -f     do not sort, enable -aU, disable -ls --color
`-f 参数可以取消排序,从而节省时间`

[root@primary linuxscript]# time ls -f &>/dev/null 

real	0m0.036s
user	0m0.012s
sys	0m0.024s

进入正题,目录下有703个文件

[root@primary linuxscript]# ls
1    116  133  150  168  185  201  219  236  253  270  288  304  321  339  356  373  390  407  424  441  459  476  493  51   527  544  561  579  596  612  63   647  664  681  699  85
10   117  134  151  169  186  202  22   237  254  271  289  305  322  34   357  374  391  408  425  442  46   477  494  510  528  545  562  58   597  613  630  648  665  682  7    86
100  118  135  152  17   187  203  220  238  255  272  29   306  323  340  358  375  392  409  426  443  460  478  495  511  529  546  563  580  598  614  631  649  666  683  70   87
101  119  136  153  170  188  204  221  239  256  273  290  307  324  341  359  376  393  41   427  444  461  479  496  512  53   547  564  581  599  615  632  65   667  684  700  88
102  12   137  154  171  189  205  222  24   257  274  291  308  325  342  36   377  394  410  428  445  462  48   497  513  530  548  565  582  6    616  633  650  668  685  71   89
103  120  138  155  172  19   206  223  240  258  275  292  309  326  343  360  378  395  411  429  446  463  480  498  514  531  549  566  583  60   617  634  651  669  686  72   9
104  121  139  156  173  190  207  224  241  259  276  293  31   327  344  361  379  396  412  43   447  464  481  499  515  532  55   567  584  600  618  635  652  67   687  73   90
105  122  14   157  174  191  208  225  242  26   277  294  310  328  345  362  38   397  413  430  448  465  482  5    516  533  550  568  585  601  619  636  653  670  688  74   91
106  123  140  158  175  192  209  226  243  260  278  295  311  329  346  363  380  398  414  431  449  466  483  50   517  534  551  569  586  602  62   637  654  671  689  75   92
107  124  141  159  176  193  21   227  244  261  279  296  312  33   347  364  381  399  415  432  45   467  484  500  518  535  552  57   587  603  620  638  655  672  69   76   93
108  125  142  16   177  194  210  228  245  262  28   297  313  330  348  365  382  4    416  433  450  468  485  501  519  536  553  570  588  604  621  639  656  673  690  77   94
109  126  143  160  178  195  211  229  246  263  280  298  314  331  349  366  383  40   417  434  451  469  486  502  52   537  554  571  589  605  622  64   657  674  691  78   95
11   127  144  161  179  196  212  23   247  264  281  299  315  332  35   367  384  400  418  435  452  47   487  503  520  538  555  572  59   606  623  640  658  675  692  79   96
110  128  145  162  18   197  213  230  248  265  282  3    316  333  350  368  385  401  419  436  453  470  488  504  521  539  556  573  590  607  624  641  659  676  693  8    97
111  129  146  163  180  198  214  231  249  266  283  30   317  334  351  369  386  402  42   437  454  471  489  505  522  54   557  574  591  608  625  642  66   677  694  80   98
112  13   147  164  181  199  215  232  25   267  284  300  318  335  352  37   387  403  420  438  455  472  49   506  523  540  558  575  592  609  626  643  660  678  695  81   99
113  130  148  165  182  2    216  233  250  268  285  301  319  336  353  370  388  404  421  439  456  473  490  507  524  541  559  576  593  61   627  644  661  679  696  82   cpu.sh
114  131  149  166  183  20   217  234  251  269  286  302  32   337  354  371  389  405  422  44   457  474  491  508  525  542  56   577  594  610  628  645  662  68   697  83   list-cronjobs.sh
115  132  15   167  184  200  218  235  252  27   287  303  320  338  355  372  39   406  423  440  458  475  492  509  526  543  560  578  595  611  629  646  663  680  698  84   newfile.sh

接下来,我们需要删除700个文件(数字命名的)的同时,保留三个脚本文件【在ls最后】。

2.1 准备工作 {#2.1-准备工作}

创建文件,将需要保留的文件名写入到文件中,一行一个名字。

[root@primary linuxscript]# cat >retention-list.txt <<EOF
> cpu.sh
> list-cronjobs.sh
> newfile.sh
> EOF

将文本文件移动到家目录下,并新建空文件夹 empty

[root@primary linuxscript]# mv retention-list.txt ~
[root@primary linuxscript]# cd ~
[root@primary ~]# ls retention-list.txt 
retention-list.txt
[root@primary ~]# mkdir empty

2.2 执行命令 {#2.2-执行命令}

[root@primary ~]# rsync -av --delete empty/ linuxscript/ --exclude-from=retention-list.txt

再次查看,文件夹中只剩下三个脚本文件

[root@primary linuxscript]# ll
total 12
-rwxr-xr-x 1 root root  619 Apr 19 15:57 cpu.sh
-rwxr-xr-x 1 root root 1896 Apr 19 15:31 list-cronjobs.sh
-rwxr-xr-x 1 root root   56 Apr 19 16:15 newfile.sh

总结 {#总结}

快速、通用的远程和本地文件复制工具。

实现命令 rsync -av --delete empty/ linuxscript/ --exclude-from=retention-list.txt

  • --delete:从目标目录中删除不在源目录的文件(因为源目录是空的,所以目标文件中的文件会被全部删除)
  • empty/:源目录(空)
  • linuxscript/:目标目录
  • --exclude-from:从文件列表中排除某些文件
  • retention-list.txt:所以在这个文件里列出的文件名不会被删除

注意
1.目录必须加上最后的 / 目录符,才表示删除目录内的文件,如果不加,运行这个命令将不会有任何效果。
2.--exclude-from 的位置非常重要,一定要跟在目标目录后,才表示在目标目录中排除。

赞(0)
未经允许不得转载:工具盒子 » Linux如何快速删除目录下大量文件