Intuitive find & replace CLI (sed alternative)

Last update: Jun 18, 2022

sd - s[earch] & d[isplace]

sd is an intuitive find & replace CLI.

The Pitch

Why use it over any existing tools?

Painless regular expressions

sd uses regex syntax that you already know from JavaScript and Python. Forget about dealing with quirks of sed or awk - get productive immediately.

String-literal mode

Non-regex find & replace. No more backslashes or remembering which characters are special and need to be escaped.

Easy to read, easy to write

Find & replace expressions are split up, which makes them easy to read and write. No more messing with unclosed and escaped slashes.

Smart, common-sense defaults

Defaults follow common sense and are tailored for typical daily use.

Comparison to sed

While sed does a whole lot more, sd focuses on doing just one thing and doing it well.

Some cherry-picked examples, where sd shines:

  • Simpler syntax for replacing all occurrences:
    • sd: sd before after
    • sed: sed s/before/after/g
  • Replace newlines with commas:
    • sd: sd '\n' ','
    • sed: sed ':a;N;$!ba;s/\n/,/g'
  • Extracting stuff out of strings containing slashes:
    • sd: echo "sample with /path/" | sd '.*(/.*/)' '$1'
    • sed: use different delimiters every time depending on expression so that the command is not completely unreadable
      • echo "sample with /path/" | sed -E 's/.*(\\/.*\\/)/\1/g'
      • echo "sample with /path/" | sed -E 's|.*(/.*/)|\1|g'
  • In place modification of files:
    • sd: sd before after file.txt
    • sed: you need to remember to use -e or else some platforms will consider the next argument to be a backup suffix
      • sed -i -e 's/before/after/g' file.txt

Benchmarks

Simple replacement on ~1.5 gigabytes of JSON

hyperfine -w 3 'sed -E "s/\"/\'/g" *.json >/dev/null' 'sd "\"" "\'" *.json >/dev/null' --export-markdown out.md

Command Mean [s] Min…Max [s]
sed -E "s/\"/'/g" *.json >/dev/null 2.338 ± 0.008 2.332…2.358
sed "s/\"/'/g" *.json >/dev/null 2.365 ± 0.009 2.351…2.378
sd "\"" "'" *.json >/dev/null 0.997 ± 0.006 0.987…1.007

Result: ~2.35 times faster

Regex replacement on a ~55M json file:

hyperfine \
'sed -E "s:(\w+):\1\1:g" dump.json >/dev/null'\
"sed 's:\(\w\+\):\1\1:g' dump.json >/dev/null"\
'sd "(\w+)" "$1$1" dump.json >/dev/null'
Command Mean [s] Min…Max [s]
sed -E "s:(\w+):\1\1:g" dump.json >/dev/null 11.315 ± 0.215 11.102…11.725
sed 's:\(\w\+\):\1\1:g' dump.json >/dev/null 11.239 ± 0.208 11.057…11.762
sd "(\w+)" "$1$1" dump.json >/dev/null 0.942 ± 0.004 0.936…0.951

Result: ~11.93 times faster

Installation

Cargo

Cargo is the Rust package manager.

You can install cargo by

curl https://sh.rustup.rs -sSf | sh

Then

cargo install sd

Alpine Linux

apk add sd

Before installing, ensure the appropriate repository is enabled.

Arch Linux

pacman -S sd

Gentoo (unc3nsored overlay)

emerge -av sys-apps/sd

Before installing, ensure the appropriate overlay is enabled.

Fedora

dnf install sd

FreeBSD

pkg install sd

Windows

choco install sd-cli

macOS

brew install sd

Void Linux

xbps-install sd

Quick Guide

  1. String-literal mode. By default, expressions are treated as regex. Use -s or --string-mode to disable regex.
> echo 'lots((([]))) of special chars' | sd -s '((([])))' ''
lots of special chars
  1. Basic regex use - let's trim some trailing whitespace
> echo 'lorem ipsum 23   ' | sd '\s+$' ''
lorem ipsum 23
  1. Capture groups

Indexed capture groups:

> echo 'cargo +nightly watch' | sd '(\w+)\s+\+(\w+)\s+(\w+)' 'cmd: $1, channel: $2, subcmd: $3'
cmd: cargo, channel: nightly, subcmd: watch

Named capture groups:

> echo "123.45" | sd '(?P<dollars>\d+)\.(?P<cents>\d+)' '$dollars dollars and $cents cents'
123 dollars and 45 cents

In the unlikely case you stumble upon ambiguities, resolve them by using ${var} instead of $var. Here's an example:

> echo '123.45' | sd '(?P<dollars>\d+)\.(?P<cents>\d+)' '$dollars_dollars and $cents_cents'
 and 
 
> echo '123.45' | sd '(?P<dollars>\d+)\.(?P<cents>\d+)' '${dollars}_dollars and ${cents}_cents'
123_dollars and 45_cents
  1. Find & replace in a file
> sd 'window.fetch' 'fetch' http.js

That's it. The file is modified in-place.

To preview changes:

> sd -p 'window.fetch' 'fetch' http.js 
  1. Find & replace across project

This example uses fd.

Good ol' unix philosophy to the rescue.

sd 'from "react"' 'from "preact"' $(fd --type file)

Same, but with backups (consider version control).

for file in $(fd --type file); do
  cp "$file" "$file.bk"
  sd 'from "react"' 'from "preact"' "$file"; 
done

Edge cases

replace/-with string needs extra -- before it, if starts with double-minus (this is a limitation of the bash itself)

echo "test/test" | sd '/' -- '--inteneded--'
test--inteneded--test

echo "start/--/end" | sd --string-mode -- '--' 'middle'
start/middle/end

GitHub

https://github.com/chmln/sd
Comments
  • 1. Ignore directory arguments

    I think it would be great if sd would silently ignore directory arguments. This would allow easier integration with shell globs and external tools like find/fd.

    Suppose I have the following structure:

    ▶ mkdir dir; echo "foo" > file; echo "foo foo" > dir/other_file
    ▶ tree
    .
    ├── dir
    │   └── other_file
    └── file
    

    Now I want to replace foo by bar, recursively. It'd be great if I could just call

    ▶ sd foo bar **/*
    

    However, this currently fails with:

    Error: Is a directory (os error 21)
    

    Interestingly, everything works with --in-place mode:

    ▶ sd -i foo bar **/*
    

    Admittedly, --in-place is almost always what I want if I supply any arguments, but I wonder if the normal (not in-place) mode should behave the same.

    Thinking of this, would it be an option to enable --in-place by default (if sd is not reading from STDIN)? Or would you consider this to be too dangerous?

    Awesome tool, by the way - Thank you!

    Reviewed by sharkdp at 2019-06-04 19:40
  • 2. Make it *very* obvious that sd will modify in-place

    First of all, thanks for the great tool! This is slowly becoming my default go-to instead of sed.

    I used sd today for the first time in a while, so I ran sd --help to refresh on the (admittedly intuitive) syntax.

    There was one line in the help dialog of note:

        -i, --in-place
                (Deprecated). Modify the files in-place. Otherwise, transformations will be emitted to STDOUT by default.
    

    If I'm not mistaken, this line is out of date. By default, sd does modify files in-place.

    I would personally vote for this tool to not modify in-place to more closely match the behavior of sed, awk, and other similar tools. I would argue that the most common use case for a tool like this is to run a few test cases through to ensure that you're doing what you think you're doing, iterate a few times, and then modify the file in place.

    However, I respect that you decided to move to the default of modifying in-place. I would ask, however, that we change the help text to make it very obvious that, by default, this tool modifies files in place. It can be very surprising to someone coming from sed, awk, or a ton of other tools. I was lucky that I had recently committed my file to git, otherwise I could have lost a lot of changes--my replacement did not behave the way I thought it would!

    I'm willing to submit a pull request if you'd be willing to merge such a change :)

    Thanks again for the great tool!

    Reviewed by HarrisonMc555 at 2020-02-14 15:40
  • 3. Default [FILES] to all the files in current directory

    I feel like modern CLI tools aiming for user's convenience (especially written in Rust, like rg, fd, sk (skim) etc) default to "all the files in current directory" (if it makes sense):

     sd [±:master] % rg replacement README.md
    49:**Simple replacement on ~1.5 gigabytes of JSON**
    61:**Regex replacement on a ~55M json file**:
    
    
    
     sd [±:master] % rg replacement
    README.md
    49:**Simple replacement on ~1.5 gigabytes of JSON**
    61:**Regex replacement on a ~55M json file**:
    
    src/cli.rs
    25:    /// Limit the number of replacements
    26:    pub replacements: Option<usize>,
    
    src/main.rs
    28:            options.replacements
    
    src/replacer.rs
    9:    replacements: usize,
    18:        replacements: Option<usize>,
    63:            replacements: replacements.unwrap_or(0),
    84:                self.replacements,
    90:                self.replacements,
    174:    fn sanity_check_literal_replacements() {
    179:    fn unescape_regex_replacements() {
    184:    fn no_unescape_literal_replacements() {
    
    build.rs
    26:                .help("Emit the replacement to STDOUT"),
    
    CHANGELOG.md
    16:- `sd` now uses memory-mapped files, allowing replacement on files of any size
    36:- Support for unicode and special characters (like `\n`) in replacement expressions
    

    I personally keep wishing for such behaviour for sd.

    Reviewed by klas-genestack at 2021-04-23 08:44
  • 4. sd throw errors when run on empty files

    Sometimes, user need to run sd on a large collection of file, eg. using fdor find. For evey file in this collection that's empty, sdwill throw the following error:

    Error processing foobar: memory map must have a non-zero length
    
    Reviewed by Porkepix at 2020-04-20 16:44
  • 5. sd creates corrupt files ("failed to write whole buffer")

    If the replacement string has a different length than the search pattern, sd either fails with an error "failed to write whole buffer" (when the replacement string is longer) or even leaves behind corrupt files (when the replacement string is shorter).

    How to reproduce:

    ▶ echo "foo" > dummy
    
    ▶ sd "foo" "fo" dummy
    
    ▶ hexdump -C dummy
    00000000  66 6f 0a 00                                       |fo..|
    00000004
    

    Notice the additional zero byte (00) at then end.

    Reviewed by sharkdp at 2019-06-16 08:29
  • 6. Dry-run mode

    In ZMV there is the -n option flag that shows you what the output would be, without actually doing anything. It is very handy for fine-tuning the regexp before actually commiting the replacement to disk.

    However, whenever I want to use it I can't seem to remember that it's -n, so maybe it's not the best choice. The expanded --dry-run would make more sense.

    Reviewed by franky47 at 2019-02-27 09:07
  • 7. Add Windows support by swapping out the `atomic_write` crate with the `atomicwrites` crate

    Hey there! I don't know if you actually care about Windows support, but it was so straightforward that I figured I'd just submit a PR. Thanks for making this great tool! :)

    Reviewed by ErichDonGubler at 2019-01-23 19:52
  • 8. character escapes in code are being followed by sd

    After running sd on a file

    sd "ProjectPaths" "Settings" -i $somefile
    

    This is an example diff:

    -                    "INTERNALERROR: invalid html: {:?}\nERROR:{:?}",
    +                    "INTERNALERROR: invalid html: {:?}
    +ERROR:{:?}",
    

    It looks like sd is interpreting the \n and using it when re-writing the file. I'm worried that other character escapes are also being treated in this way. I recommend doing extensive testing using a suite similar to the toml inputs

    https://github.com/alexcrichton/toml-rs/blob/master/test-suite/tests/valid/string-escapes.json

    I do roundtrip tests like this in stfu8, for example: https://github.com/vitiral/stfu8/blob/master/tests/sanity.rs#L84

    I also recommend running sd against unicode examples and asserting they don't change. You can see them in the .txt files here: https://github.com/vitiral/stfu8/tree/master/tests

    Reviewed by vitiral at 2019-01-15 19:38
  • 9. The input file flag is quite redundant/unintuitive

    Cool project! This is sort of an opinionated issue, but bothers me enough when trying out sd that I figured I'd file it just so it's at least filed for the future.

    To put it quite bluntly, the -i flag is redundant in the interface you have. You could easily go from this:

    cat file.txt | sd -s '((([])))' ''
    

    To this:

    sd -s '((([])))' '' file.txt
    

    As it stands, you need -i file.txt, which I think is an unnecessary flag as it's quite common to see default positional arguments done this way (for example, cat works exactly as the above suggestion). In the few minutes of me trying this tool out, I forgot the -i at least 3 times.

    I think potentially removing the argument in favour of the positional makes for a little bit of a nicer experience. If you're committed to compatibility, you can probably keep -i around as an undocumented flag to avoid breaking existing workflows.

    Thoughts? I'm happy to try and file a PR for this when I get a few minutes, if that helps.

    Reviewed by whitfin at 2018-12-26 23:57
  • 10. Installing on Windows with Chocolatey

    My CLI Swiss Army knife includes ripgrep, fd and fzf. And now sd. The first three can be installed on Windows with Chocolatey, which makes it easy to tell my friends and colleagues to check them out. It would be great to spread the word about sd too :)

    Reviewed by mardukbp at 2020-04-03 07:42
  • 11. sd fails to match when using `^` to delimit the beginning of the line

    When trying some search & replace where I wanted to match something only if the line was starting with it, I wanted to use the usual ^ to flag the beginning of the line. The result was a fail of the match wail getting rid of it resulted in fine matching. I tried to escaping it, guessing that as $ is used for variables, it probably needs some escaping to flag the end of a line the same way, but this didn't work as well.

    I guess that ^and $ should somehow be usable to flag beginning and end of the line.

    Reviewed by Porkepix at 2020-01-10 12:01
  • 12. Bump thread_local from 1.1.3 to 1.1.4

    Bumps thread_local from 1.1.3 to 1.1.4.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    Reviewed by dependabot[bot] at 2022-06-17 01:37
  • 13. Bump regex from 1.4.3 to 1.5.5

    Bumps regex from 1.4.3 to 1.5.5.

    Changelog

    Sourced from regex's changelog.

    1.5.5 (2022-03-08)

    This releases fixes a security bug in the regex compiler. This bug permits a vector for a denial-of-service attack in cases where the regex being compiled is untrusted. There are no known problems where the regex is itself trusted, including in cases of untrusted haystacks.

    1.5.4 (2021-05-06)

    This release fixes another compilation failure when building regex. This time, the fix is for when the pattern feature is enabled, which only works on nightly Rust. CI has been updated to test this case.

    1.5.3 (2021-05-01)

    This releases fixes a bug when building regex with only the unicode-perl feature. It turns out that while CI was building this configuration, it wasn't actually failing the overall build on a failed compilation.

    1.5.2 (2021-05-01)

    This release fixes a performance bug when Unicode word boundaries are used. Namely, for certain regexes on certain inputs, it's possible for the lazy DFA to stop searching (causing a fallback to a slower engine) when it doesn't actually need to.

    [PR #768](rust-lang/regex#768) fixes the bug, which was originally reported in ripgrep#1860.

    1.5.1 (2021-04-30)

    This is a patch release that fixes a compilation error when the perf-literal feature is not enabled.

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    Reviewed by dependabot[bot] at 2022-06-06 22:05
  • 14. Bump crossbeam-utils from 0.8.3 to 0.8.8

    Bumps crossbeam-utils from 0.8.3 to 0.8.8.

    Release notes

    Sourced from crossbeam-utils's releases.

    crossbeam-utils 0.8.8

    • Fix a bug when unstable loom support is enabled. (#787)

    crossbeam-utils 0.8.7

    • Add AtomicCell<{i*,u*}>::{fetch_max,fetch_min}. (#785)
    • Add AtomicCell<{i*,u*,bool}>::fetch_nand. (#785)
    • Fix unsoundness of AtomicCell<{i,u}64> arithmetics on 32-bit targets that support Atomic{I,U}64 (#781)

    crossbeam-utils 0.8.6

    • Re-add AtomicCell<{i,u}64>::{fetch_add,fetch_sub,fetch_and,fetch_or,fetch_xor} that were accidentally removed in 0.8.0 0.7.1 on targets that do not support Atomic{I,U}64. (#767)
    • Re-add AtomicCell<{i,u}128>::{fetch_add,fetch_sub,fetch_and,fetch_or,fetch_xor} that were accidentally removed in 0.8.0 0.7.1. (#767)

    crossbeam-utils 0.8.5

    • Add AtomicCell::fetch_update (#704)
    • Support targets that do not have atomic CAS on stable Rust (#698)

    crossbeam-utils 0.8.4

    • Bump loom dependency to version 0.5. (#686)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    Reviewed by dependabot[bot] at 2022-06-06 19:08
  • 15. Bump crossbeam-deque from 0.8.0 to 0.8.1

    Bumps crossbeam-deque from 0.8.0 to 0.8.1.

    Release notes

    Sourced from crossbeam-deque's releases.

    crossbeam-deque 0.8.1

    Changelog

    Sourced from crossbeam-deque's changelog.

    Version 0.8.1

    • Support targets that do not have atomic CAS on stable Rust (#698)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    Reviewed by dependabot[bot] at 2022-06-06 18:24
  • 16. '^' matches newline at EOF

    The trailing newline is a posix standard, which the normal posix tools rightfully ignores. sd however seems not to.

    [email protected] ~$ echo -e "1\n2\n3"  | sed -e 's/^/prefix-/'
    prefix-1
    prefix-2
    prefix-3
    [email protected] ~$ echo -e "1\n2\n3"  | sd '^' prefix-
    prefix-1
    prefix-2
    prefix-3
    prefix-
    

    Version: sd 0.7.6

    Reviewed by pbsds at 2022-05-25 19:45
  • 17. [Feature Request] Support Search - without replace

    It would be really sweet if there was an easy way to preview the things sd finds, before committing to a replacement.

    I realize this is a slightly different use cases and there are already tons of tools that are fast searchers (only) grep, ag, rg, etc. come to mind.

    But really, search and replace is the killer feature, and not having to switch syntaxes for either.

    Reviewed by dwt at 2022-05-25 16:11
fd is a program to find entries in your filesystem. It is a simple, fast and user-friendly alternative to find
fd is a program to find entries in your filesystem. It is a simple, fast and user-friendly alternative to find

fd is a program to find entries in your filesystem. It is a simple, fast and user-friendly alternative to find. While it does not aim to support all of find's powerful functionality, it provides sensible (opinionated) defaults for a majority of use cases.

Jun 24, 2022
Semantic find-and-replace using tree-sitter-based macro expansion

Semantic find-and-replace using tree-sitter-based macro expansion

May 11, 2022
Most intuitive global cli maker. *(lazy_static + config-rs + clap)

argone Most intuitive global cli maker. *(lazy_static + config-rs + clap) | Examples | Docs | Latest Note | [dependencies] argone = "0.5" Phases Parsi

Jun 18, 2022
fas stand for Find all stuff and it's a go app that simplify the find command and allow you to easily search everything you nedd
fas stand for Find all stuff and it's a go app that simplify the find command and allow you to easily search everything you nedd

fas fas stands for Find all stuff and it's a rust app that simplify the find command and allow you to easily search everything you need. Note: current

Dec 24, 2021
du + rust = dust. Like du but more intuitive.
du + rust = dust. Like du but more intuitive.

Dust du + rust = dust. Like du but more intuitive. Why Because I want an easy way to see where my disk is being used. Demo Install Cargo cargo install

Jun 23, 2022
A more intuitive version of du in rust
A more intuitive version of du in rust

A more intuitive version of du in rust

Sep 20, 2021
Replace an app's icon from a png with a single terminal script. Made with Rust

Replace macOS App Icon Replace an app's icon from a png with a single terminal CLI. Made with Rust

Mar 20, 2022
A command-line tool aiming to upload the local image used in your markdown file to the GitHub repo and replace the local file path with the returned URL.
A command-line tool aiming to upload the local image used in your markdown file to the GitHub repo and replace the local file path with the returned URL.

Pup A command line tool aiming to upload the local image used in your markdown file to the GitHub repo and replace the local file path with the return

Apr 20, 2022
Sugar is an alternative to the current Metaplex Candy Machine CLI

Sugar: A Candy Machine CLI Sugar is an alternative to the current Metaplex Candy Machine CLI. It has been written from the ground up and includes seve

Jun 16, 2022
Save cli commands and fuzzy find them later
Save cli commands and fuzzy find them later

crow - cli command memorizer What is crow? | Installation | Usage | FAQ What is crow? crow (command row) is a CLI tool to help you memorize CLI comman

Feb 17, 2022
A CLI tool to find the dominant colours in an image 🎨
A CLI tool to find the dominant colours in an image 🎨

dominant_colours This is a command-line tool for finding the dominant colours of an image. It prints their hex codes to the terminal, along with a pre

May 14, 2022
`ls` alternative with useful info and a splash of color 🎨
`ls` alternative with useful info and a splash of color 🎨

?? Natls ?? Why Natls? Showing file permissions Showing file size Showing the date that the file was modified last Showing the user that the file belo

Jun 21, 2022
This is choose, a human-friendly and fast alternative to cut and (sometimes) awk
This is choose, a human-friendly and fast alternative to cut and (sometimes) awk

Choose This is choose, a human-friendly and fast alternative to cut and (sometimes) awk Features terse field selection syntax similar to Python's list

Jun 18, 2022
Alternative to *fetch, uwuifies all stats.
Alternative to *fetch, uwuifies all stats.

owofetch-rs Alternative to *fetch, uwuifies all stats. Installation: Arch: AUR Other Linux distros: Either compile the source with cargo build --relea

May 9, 2022
Count your code by tokens, types of syntax tree nodes, and patterns in the syntax tree. A tokei/scc/cloc alternative.

tcount (pronounced "tee-count") Count your code by tokens, types of syntax tree nodes, and patterns in the syntax tree. Quick Start Simply run tcount

May 13, 2022
fcp is a significantly faster alternative to the classic Unix cp(1) command
fcp is a significantly faster alternative to the classic Unix cp(1) command

A significantly faster alternative to the classic Unix cp(1) command, copying large files and directories in a fraction of the time.

Jun 15, 2022
⚡ A Blazing fast alternative to the stock windows folder delete function!
⚡ A Blazing fast alternative to the stock windows folder delete function!

Turbo Delete A blazing fast alternative to the default Windows delete. Turbodelete is a blazing fast alternative to the default Windows delete functio

Jun 10, 2022
Faster and better alternative to Vtop written in Rust.
Faster and better alternative to Vtop written in Rust.

Rtop Faster and better alternative to Vtop written in Rust. Work in Progress Features Lightweight < 1MB Responsive UI Sort Process by Memory, CPU Usag

Jun 14, 2022
Eslint - Find and fix problems in your JavaScript code.
Eslint - Find and fix problems in your JavaScript code.

ESLint Website | Configuring | Rules | Contributing | Reporting Bugs | Code of Conduct | Twitter | Mailing List | Chat Room ESLint is a tool for ident

Jun 21, 2022