Skip to content

timothycohen/trash

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🗑 Trash

A Rust based CLI trash utility implementing The FreeDesktop.org Trash specification. Verbs originally based on trash-cli. It replaces the spartan rm alias with something more robust.

Installation

Compile with cargo

$ git clone https://github.com/timothycohen/trash
$ cd trash
$ cargo build --release
$ cp target/release/trash /path/to/your_bin_folder/in_PATH # example ~/.local/my_bin

Alias

I personally alias over rm (no silly mistakes :)) and the trash command from my_bin

# in .zsh_aliases or wherever you keep your aliases
alias rm='~/.local/my_bin/trash put'
alias rmc='~/.local/my_bin/trash'
alias trash='mkdir -p ~/.local/share/Trash/files; cd ~/.local/share/Trash/files;'

Examples

trash put file
Moves file to the trash

$ ls
bar.txt foo.txt
$ trash put bar.txt
$ trash put foo.txt -v
Info: Canonicalizing file paths.
Info: Writing info file to ~/.local/share/Trash/info/foo.txt.e6ba2602-6886-4ee3-851a-a27b3a64c135.trashinfo
Info: Moving trashed file to ~/.local/share/Trash/files/foo.txt.e6ba2602-6886-4ee3-851a-a27b3a64c135
$ ls
$ _

trash empty
Empties the trash directory

$ trash empty
Warn: Permanently delete all 103 files at ~/.local/share/Trash/files? [y/n] y
$ ls ~/.local/share/Trash/files
$ _

trash restore file
Restores a file by path/name

$ ls -lhAF
-rw-r--r--   1 tco  staff    13K Jun 11 21:01 bar.txt
-rw-r--r--   1 tco  staff    0B  Jun 11 21:01 foo.txt
$ trash put foo.txt
$ trash put bar.txt
$ touch bar.txt
$ trash restore foo.txt
$ trash restore bar.txt
Err: Will not overwrite file: "~/bar.txt"
$ trash restore bar.txt -f # force
$ ls -lhAF
-rw-r--r--   1 tco  staff    13K Jun 11 21:01 bar.txt # trash copy has overwritten local copy
-rw-r--r--   1 tco  staff    0B  Jun 11 21:01 foo.txt

Restore from Trash files folder directly

$ pwd
~/.local/share/Trash/files
$ ls
foz.txt.c16b01c0-116b-4fc5-ab92-8d1a15953ff7
$ trash restore foz.txt.c16b01c0-116b-4fc5-ab92-8d1a15953ff7
$ cd /private/tmp/testing/example
$ ls
foz.txt

trash info file
Show trash info from any folder

$ pwd
~/.local/share/Trash/files
$ ls
foo.txt.e6ba2602-6886-4ee3-851a-a27b3a64c135
$ trash info -a fo

[Trash Info]
FileName=foo.txt.e6ba2602-6886-4ee3-851a-a27b3a64c135
Path=/private/tmp/testing/example/foo.txt
IsDir=false
DeletionDate=2022-06-12T01:01:09.012176+00:00
FileSize=0 B

trash info
Show all trash info

$ pwd
~/.local/share/Trash/files
$ ls
foo.txt.e6ba2602-6886-4ee3-851a-a27b3a64c135
bar.txt.4cb89234-a921-428a-97b0-2edfc0326422
$ trash info

[Trash Info]
FileName=foo.txt.e6ba2602-6886-4ee3-851a-a27b3a64c135
Path=/private/tmp/testing/example/foo.txt
IsDir=false
DeletionDate=2022-06-12T01:01:09.012176+00:00
FileSize=0 B

[Trash Info]
FileName=bar.txt.4cb89234-a921-428a-97b0-2edfc0326422
Path=/private/tmp/testing/example/bar.txt
IsDir=false
DeletionDate=2022-06-12T01:01:10.803454+00:00
FileSize=13.11 KB

Handles files/directories, single/multiple, absolute/relative paths

$ pwd
~/dev/testing_trash
$ tree
.
├── nest
│   ├── really_nested
│   │   └── deep.txt
│   └── foz.txt
└── abc.txt
$ trash put abc.txt ~/dev/testing_trash/nest/really_nested nest/foz.txt
$ tree
.
└── nest
$ trash restore ~/dev/testing_trash/abc.txt ./nest/really_nested nest/foz.txt
$ tree
├── nest
│   ├── really_nested
│   │   └── deep.txt
│   └── foz.txt
└── abc.txt

trash --help

trash 0.1.0
Tim Cohen <contact@timcohen.dev>
A cli trash utility.

USAGE:
    trash [OPTIONS] <METHOD> [FILE]

ARGS:
    <METHOD>    `e` | `empty`   `i` | 'info'   `p` | `put`   `r` | `restore`
    <FILE>      The target file or directory

OPTIONS:
    -a, --all        All (wildcard `*` like matches)
    -f, --force      Force non-recoverable deletes/overwrites
    -h, --help       Print help information
    -v, --verbose    Explain all steps
    -V, --version    Print version information

Future plans

Add selection for restoring conflicting paths

$ ls
foo.txt
$ trash put ./foo.txt
$ touch foo.txt
$ trash put ./foo.txt
$ ls ~/.local/share/Trash/files
foo.txt.419fe43c-5273-4f4c-a648-b13256f330b8
foo.txt.c4037062-7d6b-47e9-a48b-fd9efb757d6c
$ trash restore foo.txt

──────────────┼───────────────────────────────────────────────────────────────
Option 1:     | foo.txt.e6ba2602-6886-4ee3-851a-a27b3a64c135.trashinfo
Path:         | private/tmp/testing/example/foo.txt
Deletion Date | 2022-06-12T01:01:09.012176+00:00
File Size     | 0 B
──────────────┼───────────────────────────────────────────────────────────────
──────────────┼───────────────────────────────────────────────────────────────
Option 2:     | foo.txt.c4037062-7d6b-47e9-a48b-fd9efb757d6c
Path:         | private/tmp/testing/example/foo.txt
Deletion Date | 2022-06-11T02:31:35.722779+00:00
File Size     | 6.42 KB
──────────────┼───────────────────────────────────────────────────────────────

Which would you like to restore? (See at ~/.local/share/Trash/files)
Option: _

Handle symlinks on all systems

tmp@ -> private/tmp

$ pwd
/tmp/testing
$ ls

$ trash restore foz.txt
$ ls
foz.txt

Trash Info for files deleted from pwd only

Recursive Info

Restore from nested deleted folder in trash directory

*Wildcard

  • info
  • restore (supported by shell expansion in the Trash dirs)
  • put (supported by shell expansion)

Add GitHub Actions for releases

Testing for different platforms (currently used on M1 macOS)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages