我需要定期清理文件夹。我得到一个文件列表,其中包含允许的文件的文本。现在我必须删除不在此文件中的所有文件。
例子:
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
ls
打印当前目录中的所有文件(按排序顺序)sort dont_delete
按排序顺序打印所有我们不想删除的文件- 该
<()
运算符将字符串转换为类似文件的对象 - 该
comm
命令比较两个预先排序的文件并打印出它们不同的行 - 使用
-2 -3
标志comm
只会打印第一个文件中包含的行,而不会打印第二个文件中包含的行,这将是可以安全删除的文件列表 - 该
tail +2
调用只是为了删除输出的标题comm
,其中包含输入文件的名称 - 现在我们在标准输出上获得了要删除的文件列表。我们将此输出通过管道传输到 ,
xargs
这将把输出流转换为 的参数列表rm
。该-p
选项强制xargs
在执行前要求确认。
答案4
除非产量ls /home/me/myfolder2tocleanup/
超过最大 shell 参数限制 ARG_MAX
大约2MB对于 Ubuntu,我建议如下。
完成该工作的一行命令实现如下:
- 将
dont-delete.txt
文件复制到包含要删除的文件的目录,如下所示:
cp dont-delete.txt /home/me/myfolder2tocleanup/
cd
到包含要删除的文件的目录,如下所示:
cd /home/me/myfolder2tocleanup/
- 进行一次试运行来测试该命令,并让它打印检测到的要删除的文件的名称而不实际删除它们,如下所示:
ls -p | grep -v / | sed 's/\<dont-delete.txt\>//g' | sort | comm -3 - <(sort dont-delete.txt) | xargs echo | tr " " "\n"
- 如果您对输出满意,请通过运行以下命令删除文件:
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
也许可以更好地避免。