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