我使用的是 Ubuntu 22.04LTS。我想创建一个文件夹“temp”,在我的会话期间,我会将文件保存在这个文件夹中,顾名思义,这些文件是临时的。我如何定义一个脚本,在关机时自动删除此文件夹的内容?
例如:我下载了一些完成某些任务所需的文档,但最终我不需要保留它们,从而避免积累无用的文件。
答案1
方案 01:(有关替代方案 01 的缺点,请参阅替代方案 02 或@Raffa 的评论。)
让我们创建临时目录,并以普通用户身份拥有它,以便我们可以以普通用户身份写入它:
sudo mkdir /my_temp_files/
sudo chown $USER:$USER /my_temp_files/
让我们编写一个脚本来删除系统启动时的临时文件。我们将脚本存储在以下目录中:
sudo mkdir -p /opt/remove_my_temp_files/bin/
创建一个名为的文件remove_my_temp_files.sh
:
sudo touch /opt/remove_my_temp_files/bin/remove_my_temp_files.sh
sudo chmod 755 /opt/remove_my_temp_files/bin/remove_my_temp_files.sh
sudo chown root:root /opt/remove_my_temp_files/bin/remove_my_temp_files.sh
将以下内容写入此文件:
#!/bin/bash
if [[ -d /my_temp_files ]] ; then
rm -fr /my_temp_files/*
rm -fr /my_temp_files/.*
fi
现在,创建一个名为remove_my_temp_files.service
:
sudo touch /etc/systemd/system/remove_my_temp_files.service
sudo chmod 644 /etc/systemd/system/remove_my_temp_files.service
sudo chown root:root /etc/systemd/system/remove_my_temp_files.service
并将以下内容写入此文件:
[Unit]
Description=Removes My Temporary Files.
[Service]
Type=oneshot
ExecStart=-/bin/bash -c '/opt/remove_my_temp_files/bin/remove_my_temp_files.sh'
[Install]
WantedBy=multi-user.target
现在,最终启用remove_my_temp_files.service
:
sudo systemctl enable remove_my_temp_files.service
/my_temp_files/
现在,每次系统启动时,此目录中创建的文件和目录都会被删除。
替代方案02:
正如@Raffa在下面的评论中所建议的那样,我的方式rm /path/to/dir/*
受到允许的命令行大小的限制,并且使用系统服务对于可以按照crontab
他的建议简单完成的任务来说有点太多了,这里是替代答案:
在 中写入以下代码$HOME/bin/remove_user_temp.sh
:
#!/bin/bash
declare MY_TEMP_DIR="$HOME/my_temp_dir/"
if [[ -e "$MY_TEMP_DIR" ]] ; then
rm -rf "$MY_TEMP_DIR"
if [[ ! -e "$MY_TEMP_DIR" ]] ; then
mkdir "$MY_TEMP_DIR"
fi
fi
使该脚本可执行:
chmod +x $HOME/bin/remove_user_temp.sh
编辑crontab
如下:
crontab -e
如果允许,选择所需的文件编辑器,然后开始编辑 cron 作业。在文件末尾添加:
@reboot $HOME/bin/remove_user_temp.sh
保存编辑并退出 crontab。这也将在系统重启时删除临时目录中的文件。
方案 03:
最简单的替代方法是将临时文件放在/tmp/
或/dev/shm/
目录中。存储在中的文件/tmp
将在下次系统启动时被删除,而/dev/shm
存储在计算机内存中的文件(而不是磁盘上的文件)将在计算机关闭或重新启动时被删除。
答案2
有一种方法可以内置于Linux,称为 tmpfs,可以实现这一点。要使用它,请创建一个文件夹 tmpfs,当您创建该文件夹后,文件夹中的所有内容都会在它不再是 tmpfs 或计算机关闭时消失。缺点是 tmpfs 文件夹中的文件只能驻留在 RAM 或交换中。
# mount -t tmpfs tmpfs temp
文件系统不会存储文件夹是否为 tmpfs。要将文件夹永久标记为 tmpfs,您应该编辑/etc/fstab
:
tmpfs /tmp tmpfs defaults 0 2
除了 tmpfs,Ubuntu 的服务还会/tmp
在启动时自动清理目录(感谢 raj),因此您可以将任何临时文件放在那里。
答案3
这是 @rusty 答案的一个更简单的版本。我将使用官方的 systemd-tmpfiles 机制。请注意,就像那个答案一样,我的答案是在开机时而不是关机时删除内容。只需将以下内容粘贴到/etc/tmpfiles.d/my-temp-files-1503475-1004020.conf
:
D /my_temp_dir 0755 root root
如果需要,请更改root
为$USER
。对于仅限用户的替代方案,您可以使用~/.config/user-tmpfiles.d/
after systemctl --user enable systemd-tmpfiles-setup
。这将使用 systemd-tmpfiles,例如@muru 的回答但它systemd-tmpfiles-setup
不使用。对于这样一项基本任务,systemd-tmpfiles-clean
无需混合使用 bash 脚本来/opt
安装enable
和运行 .services、手动、、、rm
或cron。chmod
chown
/opt