Fixed indent -> 4 spaces
This commit is contained in:
parent
7631304d4c
commit
f154424db2
294
bin
294
bin
@ -26,12 +26,12 @@ force_flag=
|
|||||||
[ -z "$RS" ] && RS='\n'
|
[ -z "$RS" ] && RS='\n'
|
||||||
|
|
||||||
fail() {
|
fail() {
|
||||||
echo "$@" 1>&2
|
echo "$@" 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
show_usage() {
|
show_usage() {
|
||||||
cat << EOU
|
cat << EOU
|
||||||
Usage: $progname [OPTION]... FILE...
|
Usage: $progname [OPTION]... FILE...
|
||||||
|
|
||||||
Move files into the trash bin.
|
Move files into the trash bin.
|
||||||
@ -52,115 +52,115 @@ EOU
|
|||||||
}
|
}
|
||||||
|
|
||||||
find_trashfile() {
|
find_trashfile() {
|
||||||
target0="$1"
|
target0="$1"
|
||||||
target="$(readlink -f -- "$target0")"
|
target="$(readlink -f -- "$target0")"
|
||||||
td="$(get_trashdir "$target")"
|
td="$(get_trashdir "$target")"
|
||||||
if [ "$(dirname "$target")" = "$td/files" ] && [ -e "$target" ]; then
|
if [ "$(dirname "$target")" = "$td/files" ] && [ -e "$target" ]; then
|
||||||
echo "$target"
|
echo "$target"
|
||||||
else
|
else
|
||||||
best_file=
|
best_file=
|
||||||
best_date=0
|
best_date=0
|
||||||
for f in "$td/files"/*; do
|
for f in "$td/files"/*; do
|
||||||
[ -e "$f" ] || continue
|
[ -e "$f" ] || continue
|
||||||
info="$td/info/$(basename "$f").trashinfo"
|
info="$td/info/$(basename "$f").trashinfo"
|
||||||
path="$(path_from_trashinfo "$info")"
|
path="$(path_from_trashinfo "$info")"
|
||||||
date="$(date +"%s" -d "$(date_from_trashinfo "$info")")"
|
date="$(date +"%s" -d "$(date_from_trashinfo "$info")")"
|
||||||
if [ "$path" = "$target" -a \( -z "$best_file" -o "$date" -gt "$best_date" \) ]; then
|
if [ "$path" = "$target" -a \( -z "$best_file" -o "$date" -gt "$best_date" \) ]; then
|
||||||
best_file="$f"
|
best_file="$f"
|
||||||
best_date="$date"
|
best_date="$date"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
[ -z "$best_file" ] && return 1
|
[ -z "$best_file" ] && return 1
|
||||||
echo "$best_file"
|
echo "$best_file"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
confirm() {
|
confirm() {
|
||||||
[ "$force_flag" = "-f" ] && return 0
|
[ "$force_flag" = "-f" ] && return 0
|
||||||
if type ask >/dev/null; then
|
if type ask >/dev/null; then
|
||||||
ask -n "$@"
|
ask -n "$@"
|
||||||
else
|
else
|
||||||
# Get one character of input
|
# Get one character of input
|
||||||
tput civis >/dev/tty;
|
tput civis >/dev/tty;
|
||||||
printf '\033[1m%s\033[0m' "$2" >/dev/tty;
|
printf '\033[1m%s\033[0m' "$2" >/dev/tty;
|
||||||
stty -icanon -echo >/dev/tty 2>/dev/tty;
|
stty -icanon -echo >/dev/tty 2>/dev/tty;
|
||||||
REPLY="$(dd bs=1 count=1 2>/dev/null </dev/tty)"
|
REPLY="$(dd bs=1 count=1 2>/dev/null </dev/tty)"
|
||||||
stty icanon echo >/dev/tty 2>/dev/tty
|
stty icanon echo >/dev/tty 2>/dev/tty
|
||||||
tput cvvis >/dev/tty
|
tput cvvis >/dev/tty
|
||||||
[ "$REPLY" = "y" ]
|
[ "$REPLY" = "y" ]
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
has_arg() {
|
has_arg() {
|
||||||
if type arg >/dev/null; then
|
if type arg >/dev/null; then
|
||||||
arg "$@" >/dev/null
|
arg "$@" >/dev/null
|
||||||
else
|
else
|
||||||
target="$1"
|
target="$1"
|
||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
[ "$1" = "$target" ] && return 0
|
[ "$1" = "$target" ] && return 0
|
||||||
[ "$1" = "--" ] && break
|
[ "$1" = "--" ] && break
|
||||||
done
|
done
|
||||||
false
|
false
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
is_valid_trashdir() {
|
is_valid_trashdir() {
|
||||||
[ -d "$1" ] && expr "$(stat -c '%a' "$1")" : '^1[0-7]\{3\}' >/dev/null && ! [ -L "$1" ]
|
[ -d "$1" ] && expr "$(stat -c '%a' "$1")" : '^1[0-7]\{3\}' >/dev/null && ! [ -L "$1" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
get_trashdir() {
|
get_trashdir() {
|
||||||
file="$(readlink -f -- "$1")"
|
file="$(readlink -f -- "$1")"
|
||||||
if [ -e "$file" ]; then
|
if [ -e "$file" ]; then
|
||||||
file_base="$(df -h "$file" | awk 'NR==2 {print $NF}')"
|
file_base="$(df -h "$file" | awk 'NR==2 {print $NF}')"
|
||||||
else
|
else
|
||||||
file_base="$(awk -v f="$file" 'substr(f,1,length($2)+1)==($2 "/") && $2>best {best=$2} END {print best}' /proc/mounts)"
|
file_base="$(awk -v f="$file" 'substr(f,1,length($2)+1)==($2 "/") && $2>best {best=$2} END {print best}' /proc/mounts)"
|
||||||
fi
|
fi
|
||||||
home_base="$(df -h "$HOME" | awk 'NR==2 {print $NF}')"
|
home_base="$(df -h "$HOME" | awk 'NR==2 {print $NF}')"
|
||||||
if [ "$file_base" = "$home_base" ]; then
|
if [ "$file_base" = "$home_base" ]; then
|
||||||
echo "$HOME/.Trash"
|
echo "$HOME/.Trash"
|
||||||
elif is_valid_trashdir "$file_base/.Trash"; then
|
elif is_valid_trashdir "$file_base/.Trash"; then
|
||||||
echo "$file_base/.Trash"
|
echo "$file_base/.Trash"
|
||||||
else
|
else
|
||||||
echo "$file_base/.Trash-$(id -u)"
|
echo "$file_base/.Trash-$(id -u)"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
can_trash() {
|
can_trash() {
|
||||||
filename="$1"
|
filename="$1"
|
||||||
if [ ! -e "$filename" ]; then
|
if [ ! -e "$filename" ]; then
|
||||||
if [ "$force_flag" != "-f" ]; then
|
if [ "$force_flag" != "-f" ]; then
|
||||||
fail "$progname: cannot move '$filename' to trash: No such file or directory"
|
fail "$progname: cannot move '$filename' to trash: No such file or directory"
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
fi
|
fi
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$interactive_flag" = "-i" ]; then
|
if [ "$interactive_flag" = "-i" ]; then
|
||||||
[ -d "$filename" ] && type=directory || type="file"
|
[ -d "$filename" ] && type=directory || type="file"
|
||||||
confirm "$progname: move $type '$filename' to trash?"
|
confirm "$progname: move $type '$filename' to trash?"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
init_trashdir() {
|
init_trashdir() {
|
||||||
trashdir=$1
|
trashdir=$1
|
||||||
if ! [ -d "$trashdir" ]; then
|
if ! [ -d "$trashdir" ]; then
|
||||||
mkdir -m 1755 "$trashdir" || fail "Could not create trash directory"
|
mkdir -m 1755 "$trashdir" || fail "Could not create trash directory"
|
||||||
fi
|
fi
|
||||||
mkdir -p "$trashdir/files" || fail "$progname: unable to write to $trashdir"
|
mkdir -p "$trashdir/files" || fail "$progname: unable to write to $trashdir"
|
||||||
mkdir -p "$trashdir/info" || fail "$progname: unable to write to $trashdir"
|
mkdir -p "$trashdir/info" || fail "$progname: unable to write to $trashdir"
|
||||||
}
|
}
|
||||||
|
|
||||||
path_from_trashinfo() {
|
path_from_trashinfo() {
|
||||||
#sed -n 's/^Path=//p' "$1" | php -r 'echo urldecode(fgets(STDIN));'
|
#sed -n 's/^Path=//p' "$1" | php -r 'echo urldecode(fgets(STDIN));'
|
||||||
sed -n 's/^Path=//p' "$1" | perl -MURI::Escape -ne 'print uri_unescape $_'
|
sed -n 's/^Path=//p' "$1" | perl -MURI::Escape -ne 'print uri_unescape $_'
|
||||||
}
|
}
|
||||||
|
|
||||||
date_from_trashinfo() {
|
date_from_trashinfo() {
|
||||||
sed -n 's/^DeletionDate=//p' "$1"
|
sed -n 's/^DeletionDate=//p' "$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
trashinfo_for_file() {
|
trashinfo_for_file() {
|
||||||
#php -r 'echo urlencode($argv[1]);' -- "$1"
|
#php -r 'echo urlencode($argv[1]);' -- "$1"
|
||||||
cat <<END
|
cat <<END
|
||||||
[Trash Info]
|
[Trash Info]
|
||||||
Path=$(perl -MURI::Escape -e 'print uri_escape $ARGV[0]' -- "$1")
|
Path=$(perl -MURI::Escape -e 'print uri_escape $ARGV[0]' -- "$1")
|
||||||
DeletionDate=$(date +"%FT%H:%M:%S")
|
DeletionDate=$(date +"%FT%H:%M:%S")
|
||||||
@ -168,20 +168,20 @@ END
|
|||||||
}
|
}
|
||||||
|
|
||||||
trash_file() {
|
trash_file() {
|
||||||
filename=$1
|
filename=$1
|
||||||
dir=${filename%/*}
|
dir=${filename%/*}
|
||||||
trashdir="$(get_trashdir "$dir")"
|
trashdir="$(get_trashdir "$dir")"
|
||||||
init_trashdir "$trashdir"
|
init_trashdir "$trashdir"
|
||||||
|
|
||||||
trashname="${filename##*/}"
|
trashname="${filename##*/}"
|
||||||
origname="${trashname%%.*}"
|
origname="${trashname%%.*}"
|
||||||
if [ -z "$origname" ]; then
|
if [ -z "$origname" ]; then
|
||||||
origname="dotfile"
|
origname="dotfile"
|
||||||
fi
|
fi
|
||||||
ext=".${trashname##*.}"
|
ext=".${trashname##*.}"
|
||||||
if [ "$ext" = ".$trashname" ]; then
|
if [ "$ext" = ".$trashname" ]; then
|
||||||
ext=""
|
ext=""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Use -u (unsafe) option because we cannot mv a directory into a
|
# Use -u (unsafe) option because we cannot mv a directory into a
|
||||||
# file. This is technically "unsafe" but mv will ask for
|
# file. This is technically "unsafe" but mv will ask for
|
||||||
@ -191,73 +191,73 @@ trash_file() {
|
|||||||
deletedinfo="$trashdir/info/$deletedbase.trashinfo"
|
deletedinfo="$trashdir/info/$deletedbase.trashinfo"
|
||||||
|
|
||||||
trashinfo_for_file "$filename" > "$deletedinfo" || \
|
trashinfo_for_file "$filename" > "$deletedinfo" || \
|
||||||
fail "$progname: unable to create trash info for $filename at $deletedinfo"
|
fail "$progname: unable to create trash info for $filename at $deletedinfo"
|
||||||
|
|
||||||
# Note that the trashinfo file will have the ownership and
|
# Note that the trashinfo file will have the ownership and
|
||||||
# permissions of the person who deleted the file, and not
|
# permissions of the person who deleted the file, and not
|
||||||
# necessarily of the original file.
|
# necessarily of the original file.
|
||||||
|
|
||||||
if ! mv $verbose_flag -- "$filename" "$deletedfile"; then
|
if ! mv $verbose_flag -- "$filename" "$deletedfile"; then
|
||||||
rm "$deletedinfo"
|
rm "$deletedinfo"
|
||||||
fail "$progname: unable to move $filename to $deletedfile"
|
fail "$progname: unable to move $filename to $deletedfile"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
untrash_files() {
|
untrash_files() {
|
||||||
[ $# -eq 0 ] && fail "No files provided to untrash"
|
[ $# -eq 0 ] && fail "No files provided to untrash"
|
||||||
for target; do
|
for target; do
|
||||||
if ! file="$(find_trashfile "$target")"; then
|
if ! file="$(find_trashfile "$target")"; then
|
||||||
[ "$force_flag" = "-f" ] || fail "No such file: $target"
|
[ "$force_flag" = "-f" ] || fail "No such file: $target"
|
||||||
fi
|
fi
|
||||||
info="$(dirname "$file")/../info/$(basename "$file").trashinfo"
|
info="$(dirname "$file")/../info/$(basename "$file").trashinfo"
|
||||||
orig="$(path_from_trashinfo "$info")"
|
orig="$(path_from_trashinfo "$info")"
|
||||||
mv ${force_flag:--i} $verbose_flag "$file" "$orig" || fail "Could not restore file: $file"
|
mv ${force_flag:--i} $verbose_flag "$file" "$orig" || fail "Could not restore file: $file"
|
||||||
rm -rf $verbose_flag "$info" || fail "Could not clean up trash info file: $info"
|
rm -rf $verbose_flag "$info" || fail "Could not clean up trash info file: $info"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
empty_files() {
|
empty_files() {
|
||||||
[ $# -eq 0 ] && fail "No files provided to empty"
|
[ $# -eq 0 ] && fail "No files provided to empty"
|
||||||
for target; do
|
for target; do
|
||||||
if ! file="$(find_trashfile "$target")"; then
|
if ! file="$(find_trashfile "$target")"; then
|
||||||
[ "$force_flag" = "-f" ] || fail "No such file: $target"
|
[ "$force_flag" = "-f" ] || fail "No such file: $target"
|
||||||
fi
|
fi
|
||||||
info="$(dirname "$file")/../info/$(basename "$file").trashinfo"
|
info="$(dirname "$file")/../info/$(basename "$file").trashinfo"
|
||||||
orig="$(path_from_trashinfo "$info")"
|
orig="$(path_from_trashinfo "$info")"
|
||||||
confirm "Delete file $file?" || exit 1
|
confirm "Delete file $file?" || exit 1
|
||||||
rm -r $force_flag $verbose_flag -- "$file" "$info" || fail "Could not empty file: $file"
|
rm -r $force_flag $verbose_flag -- "$file" "$info" || fail "Could not empty file: $file"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
empty_trash() {
|
empty_trash() {
|
||||||
[ $# -eq 0 ] && set "$PWD"
|
[ $# -eq 0 ] && set "$PWD"
|
||||||
for target; do
|
for target; do
|
||||||
td="$(get_trashdir "$(readlink -f -- "$target")")"
|
td="$(get_trashdir "$(readlink -f -- "$target")")"
|
||||||
[ -d "$td/files" ] && [ -n "$(ls -A "$td/files")" ] || continue
|
[ -d "$td/files" ] && [ -n "$(ls -A "$td/files")" ] || continue
|
||||||
[ "$force_flag" != "-f" ] &&
|
[ "$force_flag" != "-f" ] &&
|
||||||
( printf '\033[1mThe following %s of files will be deleted:\033[0m\n' \
|
( printf '\033[1mThe following %s of files will be deleted:\033[0m\n' \
|
||||||
"$(du -h --summarize "$td/files" | cut -f1)B" &&
|
"$(du -h --summarize "$td/files" | cut -f1)B" &&
|
||||||
printf ' \033[33m%s\033[0m\n' "$td"/files/*) | more
|
printf ' \033[33m%s\033[0m\n' "$td"/files/*) | more
|
||||||
if ! confirm "Do you want to proceed?"; then
|
if ! confirm "Do you want to proceed?"; then
|
||||||
echo "Aborted."
|
echo "Aborted."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
rm -r $verbose_flag "$td"/files/* "$td"/info/* || exit 1
|
rm -r $verbose_flag "$td"/files/* "$td"/info/* || exit 1
|
||||||
printf '\033[1mDeleted!\033[0m\n'
|
printf '\033[1mDeleted!\033[0m\n'
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
list_trash() {
|
list_trash() {
|
||||||
[ $# -eq 0 ] && set "$PWD"
|
[ $# -eq 0 ] && set "$PWD"
|
||||||
for target; do
|
for target; do
|
||||||
td="$(get_trashdir "$(readlink -f -- "$target")")"
|
td="$(get_trashdir "$(readlink -f -- "$target")")"
|
||||||
for f in "$td/files"/*; do
|
for f in "$td/files"/*; do
|
||||||
[ -e "$f" ] || continue
|
[ -e "$f" ] || continue
|
||||||
printf '%s'"$FS"'%s'"$FS"'%s'"$RS" \
|
printf '%s'"$FS"'%s'"$FS"'%s'"$RS" \
|
||||||
"$f" "$(date_from_trashinfo "$td/info/$(basename "$f").trashinfo")" \
|
"$f" "$(date_from_trashinfo "$td/info/$(basename "$f").trashinfo")" \
|
||||||
"$(path_from_trashinfo "$td/info/$(basename "$f").trashinfo")"
|
"$(path_from_trashinfo "$td/info/$(basename "$f").trashinfo")"
|
||||||
|
done
|
||||||
done
|
done
|
||||||
done
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ $# -eq 0 ]; then
|
if [ $# -eq 0 ]; then
|
||||||
@ -277,8 +277,8 @@ action=trash
|
|||||||
(has_arg -E "$@" || has_arg --empty-all "$@") && action=emptyall
|
(has_arg -E "$@" || has_arg --empty-all "$@") && action=emptyall
|
||||||
|
|
||||||
while a="$(expr ";$1" : "^;\(--\|-[VhvirRfueEl]\+\|--version\|--help\|--verbose\|--interactive\|--recursive\|--force\|--untrash\|--empty\|--empty-all\|--list\)$")"; do
|
while a="$(expr ";$1" : "^;\(--\|-[VhvirRfueEl]\+\|--version\|--help\|--verbose\|--interactive\|--recursive\|--force\|--untrash\|--empty\|--empty-all\|--list\)$")"; do
|
||||||
shift
|
shift
|
||||||
[ "$a" = "--" ] && break
|
[ "$a" = "--" ] && break
|
||||||
done
|
done
|
||||||
|
|
||||||
case "$action" in
|
case "$action" in
|
||||||
@ -292,9 +292,9 @@ case "$action" in
|
|||||||
for f; do
|
for f; do
|
||||||
filename="$(readlink -f -- "$f")"
|
filename="$(readlink -f -- "$f")"
|
||||||
if ! [ -e "$filename" ]; then
|
if ! [ -e "$filename" ]; then
|
||||||
[ "$force_flag" = "-f" ] || fail "File does not exist: $filename"
|
[ "$force_flag" = "-f" ] || fail "File does not exist: $filename"
|
||||||
else
|
else
|
||||||
can_trash "$filename" && trash_file "$filename" || exit 1
|
can_trash "$filename" && trash_file "$filename" || exit 1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
;;
|
;;
|
||||||
|
Loading…
Reference in New Issue
Block a user