一、问题描述 {#一、问题描述}
如何删除目录下大量文件【保留指定文件】。
如果某目录下有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 的位置非常重要,一定要跟在目标目录后,才表示在目标目录中排除。