删除文件但排除列表中的所有文件

ste*_*n83 19 command-line bash scripts rm

我需要定期清理文件夹。我得到一个包含文本的文件列表,哪些文件是允许的。现在我必须删除不在这个文件中的所有文件。

例子:

dont-delete.txt

dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
Run Code Online (Sandbox Code Playgroud)

我的文件夹 do clean-up 包含此示例:

ls /home/me/myfolder2tocleanup/

dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Run Code Online (Sandbox Code Playgroud)

所以这个文件应该被删除:

this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Run Code Online (Sandbox Code Playgroud)

我搜索了一些东西来创建一个删除命令,并带有一个选项来排除文件提供的一些文件。

L. *_*mes 13

rm命令已被注释掉,以便您可以检查并验证它是否按需要工作。然后只需取消注释该行。

check directory部分将确保您不会意外地从错误的目录运行脚本并破坏错误的文件。

您可以删除该echo deleting行以静默运行。

#!/bin/bash

cd /home/me/myfolder2tocleanup/

# Exit if the directory isn't found.
if (($?>0)); then
    echo "Can't find work dir... exiting"
    exit
fi

for i in *; do
    if ! grep -qxFe "$i" filelist.txt; then
        echo "Deleting: $i"
        # the next line is commented out.  Test it.  Then uncomment to removed the files
        # rm "$i"
    fi
done
Run Code Online (Sandbox Code Playgroud)


Ser*_*nyy 10

这个python脚本可以做到这一点:

#!/usr/bin/env python3
import os
no_remove = set()
with open('./dont-delete.txt') as f:
     for line in f:
         no_remove.add(line.strip())

for f in os.listdir('.'):
    if f not in no_remove:
        print('unlink:' + f ) 
        #os.unlink(f)
Run Code Online (Sandbox Code Playgroud)

重要的部分是取消对该os.unlink()函数的注释。

注意:将此脚本添加dont-delete.txt到您的脚本中,dont-delete.txt以便它们都在列表中,并将它们保存在同一目录中。


gar*_*ead 8

这是一个单行:

comm -2 -3 <(ls) <(sort dont_delete) | tail +2 | xargs -p rm
Run Code Online (Sandbox Code Playgroud)
  1. ls 打印当前目录中的所有文件(按排序顺序)
  2. sort dont_delete 按排序顺序打印我们不想删除的所有文件
  3. <()操作者接通一个字符串转换为一个类文件对象
  4. 这些comm命令比较两个预先排序的文件并打印出它们不同的行
  5. 使用-2 -3标志导致comm只打印第一个文件中包含的行,而不打印第二个文件中的行,这将是可以安全删除的文件列表
  6. tail +2呼叫只是删除的标题comm输出,其中包含输入文件名
  7. 现在我们得到了要在标准输出上删除的文件列表。我们将此输出通过管道xargs传输到它将输出流转换为 的参数列表rm。该-p选项强制xargs在执行前要求确认。