forked from zhangdft/scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathterminal_trash.sh
139 lines (121 loc) · 3.07 KB
/
terminal_trash.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/bin/bash -c 'echo This file is meant to be sourced.'
alias rm='del'
# make rm(1) safe.
# Remove or comment-out this line to return to normal rm(1) functionality.
function del ()
{
if declare -F trash >/dev/null
then
trash "$@"
else
command rm -i "$@"
fi
}
function trash ()
{
local F
local HOME_DEVICE="$(stat -f %Sd "$HOME")"
local TRASHCAN=~/.Trash
# Set this in advance _outside_ the loop below
for F in "$@"
do
if ! test -e "$F"
then
echo "No such file or directory: $F" 1>&2
return 4
fi
local DEVICE="$(stat -f %Sd "$F")"
if [ x"$DEVICE" == x"" ] || [ x"$DEVICE" == x"???" ]
then
echo "Can't locate trash for ${F}." 1>&2
return 3
fi
if [ x"$DEVICE" != x"$HOME_DEVICE" ]
then
TRASHCAN="$(trashOnDevice "$DEVICE")"
fi
if [ ! -d "${TRASHCAN}" ]
then
command rm -f "${TRASHCAN}"
if ! mkdir -m 700 "${TRASHCAN}"
then
echo "$TRASHCAN is inaccessible at this time." | sed 's;'"$HOME"';~;g' 1>&2
return 1
fi
fi
local FinT="$(basename "$F")"
if [ -e "${TRASHCAN}/${FinT}" ]
then
FinT="$(date) ${FinT}"
fi
if ! mv -vn "$F" "${TRASHCAN}/${FinT}"
then
echo "Unable to move $F to the trash." 1>&2
return 2
fi
done
local TRASHSIZE="$(du -hs "${TRASHCAN}" 2>/dev/null | cut -f 1)"
local TRASHCANloc="$(dirname "$TRASHCAN" | sed 's;^/Volumes/\(.*\)/.Trashes;\1;g' | sed 's;'"$HOME"';~;g' | sed 's;^/.Trashes;/;g')"
echo "${TRASHSIZE:- 0B} in trash on $TRASHCANloc."
}
function emptytrash ()
{
local TMPIFS="$IFS"
IFS='
'
local MOUNTS=( $(mount | sed -n 's:/dev/.* on \(.*\) (.*):\1:p') )
local TRASHCANs=( "${HOME}/.Trash" $(IFS="$TMPIFS";for i in `seq 0 $(( ${#MOUNTS[@]} - 1 ))`; do echo "${MOUNTS[$i]}/.Trashes/$(id -u)"; done) )
IFS="$TMPIFS"
unset TMPIFS
local TRASH_SIZE
TRASH_SIZE="$( (for i in "${TRASHCANs[@]}"; do ls "$i"/; done) 2>/dev/null | wc -w)"
if [ "$TRASH_SIZE" -gt 0 ]
then
echo -n "Emptying trash"
for i in "${TRASHCANs[@]}"
do
tput smcup
pushd "$i" 2>/dev/null && {
srm -frsvz . 2>/dev/null ; popd ;
}
tput rmcup
echo -n .
done
local DONE=
[ `ls "${HOME}/.Trash" | wc -w` == 0 ] && DONE="Done."
echo "$DONE"
else
echo "Trash is empty."
fi
}
function trashOnDevice ()
{
local DEVICE="$1"
local MOUNT="$(mount | sed -n 's:/dev/'"$DEVICE"' on \(.*\) (.*):\1:p')"
if [ x"$MOUNT" == x"" ] || [ x"$MOUNT" == x"???" ]
then
# If no mount point is found, then don't return the path to root!
return 1
elif [ x"$MOUNT" == x"/" ]
then
# Encourage the resulting path to _not_ start with two slashes
MOUNT=""
fi
echo "$MOUNT/.Trashes/$UID"
}
# Usage : seq n m [i]
# echo all integers between n and m using a skip or increment of i
function seq ()
{
[ "$1" ] || [ "$2" ] || return 1
local x=$1;
local y=$2;
local i=${3:-1};
local seperator="${4:- }"
while [ $x -le $y ]
do
echo -n $x"${seperator}";
x=$(( $x + $i ));
done
echo
}