![攔截對 rm 的調用,並將已刪除的檔案定向到垃圾箱](https://rvso.com/image/1036618/%E6%94%94%E6%88%AA%E5%B0%8D%20rm%20%E7%9A%84%E8%AA%BF%E7%94%A8%EF%BC%8C%E4%B8%A6%E5%B0%87%E5%B7%B2%E5%88%AA%E9%99%A4%E7%9A%84%E6%AA%94%E6%A1%88%E5%AE%9A%E5%90%91%E5%88%B0%E5%9E%83%E5%9C%BE%E7%AE%B1.png)
有沒有辦法攔截對 rm 的調用,而不是永久刪除文件,而是將它們移到垃圾箱?
答案1
有一個webupd8.org 上的食譜為了這。為了防止連結失效,這裡是重要資訊(還有一些補充)。
sudo apt-get install trash-cli
這將安裝trash
、empty-trash
和命令,您可以按原樣使用它們或為其建立list-trash
別名(請參閱下文)。restore-trash
rm
trash
該命令的語義trash
與標準有點不同rm
- 它不需要-r
標誌即可刪除目錄。如果這讓您感到困擾,webupd8.org 建議使用以下腳本,您可以將其放入 PATH 中並呼叫它trash-rm
:
#!/bin/bash
# command name: trash-rm
shopt -s extglob
recursive=1
declare -a cmd
((i = 0))
for f in "$@"; do
case "$f" in
(-*([fiIv])r*([fiIv])|-*([fiIv])R*([fiIv]))
tmp="${f//[rR]/}"
if [ -n "$tmp" ]; then
#echo "\$tmp == $tmp"
cmd[$i]="$tmp"
((i++))
fi
recursive=0
;;
(--recursive) recursive=0
;;
(*)
if [ $recursive != 0 -a -d "$f" ]; then
echo "skipping directory: $f"
continue
else
cmd[$i]="$f"
((i++))
fi
;;
esac
done
trash "${cmd[@]}"
在 Ubuntu 12.04 及更高版本中,腳本中的最後一個命令應該是trash-put "${cmd[@]}"
而不是trash "${cmd[@]}"
(因為該命令已從 更改trash
為trash-put
)。
然後使腳本可執行:
chmod +x trash-rm
一旦你將它放在你的某個目錄中PATH
,就在你的 ~/.bashrc 中添加一個別名,這將使 bash 調用你的腳本而不是實際的rm
命令:
alias rm="trash-rm"
正如 djeikyb 正確指出的那樣,.bashrc 別名技巧僅適用於修改了 .bashrc 的用戶,並且僅在 bash 終端會話中有效。
應該就是這樣。
答案2
庫垃圾(Ubuntu 中的 libtrash 套件)似乎可以做到這一點,但我從未使用過它。