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

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

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

例子:

dont-delete.txt

dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt

我的文件夹进行清理包含以下示例:

ls /home/me/myfolder2tocleanup/

dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt

因此应该删除这个文件:

this-can-be-deleted.txt
also-waste.txt
never-used-it.txt

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

答案1

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

答案2

这个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)

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

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

答案3

以下是一行代码:

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

答案4

除非产量ls /home/me/myfolder2tocleanup/超过最大 shell 参数限制 ARG_MAX大约2MB对于 Ubuntu,我建议如下。


完成该工作的一行命令实现如下:

  1. dont-delete.txt文件复制到包含要删除的文件的目录,如下所示:
cp dont-delete.txt /home/me/myfolder2tocleanup/
  1. cd到包含要删除的文件的目录,如下所示:
cd /home/me/myfolder2tocleanup/
  1. 进行一次试运行来测试该命令,并让它打印检测到的要删除的文件的名称而不实际删除它们,如下所示:
ls -p | grep -v / | sed 's/\<dont-delete.txt\>//g' | sort | comm -3 - <(sort dont-delete.txt) | xargs echo | tr " " "\n"
  1. 如果您对输出满意,请通过运行以下命令删除文件:
ls -p | grep -v / | sed 's/\<dont-delete.txt\>//g' | sort | comm -3 - <(sort dont-delete.txt) | xargs rm

解释:

  • ls -p将列出所有文件和目录在当前目录中,该选项将在目录名称中-p添加。/
  • grep -v //将通过删除名称中包含的所有项目来排除目录。
  • sed 's/\<dont-delete.txt\>//g'将排除该dont-delete.txt文件,因此它不会在该过程中被删除。
  • sort为了确保万无一失,我们将对剩余的输出进行排序ls
  • comm -3 - <(sort dont-delete.txt)将对dont-delete.txt文件进行排序,将其与排序后的输出进行比较,ls并排除两者中都存在的文件名。
  • xargs rm将删除已处理输出中的所有剩余文件名ls。这意味着当前目录中的所有项目都将被删除,除了目录dont-delete.txt文件中列出的文件文件dont-delete.txt本身

在试运行部分:

  • xargs echo将打印应删除的文件。
  • tr " " "\n"将把空格转换为新行,以便于阅读。

注意:

在某些情况下解析输出ls也许可以更好地避免。

相关内容