Anyone else adding "verbose", "interactive" and "recursive" to basic file commands?
As a person raised by GUIs, an extra visual confirmation and an extra prompt is a nice touch. I also like when the system says "Oh, is that a directory? No problem, I'll give you the usual treatment." You know what I mean?
alias ls='ls --group-directories-first --color=auto -w 120'
alias ll='exa --group-directories-first -l'
alias la='ll -a'
alias lt='ll --tree'
alias cp='cp --recursive --interactive --verbose --reflink=always'
alias mv='mv --interactive --verbose'
# custom pwd
# - replace $HOME with ~
# - make everything before the last '/' green, and everything after white and bold
# - alias to p
alias pwd="pwd | sed 's:$HOME:~:' | sed -E 's:(.*/)([^/]+):\x1b[32m\1\x1b[0m\x1b[1m\2\x1b[0m:'"
alias p="pwd"
# custom cd.
# - prints the new directory after cd'ing.
cd () {
command cd "$@" && p;
}
alias c="cd"
alias '..'='c ..'
alias '...'='c ../..'
# For the '~' alias, we want to use the original cd because printing '~'
# again would be redundant.
alias '~'='command cd'
# custom rm.
# adds a '-r' flag only if there is a single argument and that argument
# is a directory.
# This is because I want the behavior of -I (interactive) to be the default,
# but I also want to have the -r flag available when I need it without being
# prompted for single files.
function rm () {
if [ $# -eq 1 ] && [ -d "$1" ]; then
rm --verbose --interactive=once --recursive "$1";
else
rm --verbose --interactive=once "$@";
fi;
}
# mkdir + cd (created as a function because they run on the current shell,
# which is what we want for cd)
mc () {
mkdir -p -- "$1" && cd -P -- "$1";
}
Only when needed. And I don't really use aliases at all for basic things like that. I don't like things like cp or mv being verbose most of the time as I don't have much use for their output and like it when commands are quite unless there is a problem as it makes it easier to see the error lines. I don't really want to be confirming every file in a recursive rm or cp or mv either - just leads to hitting y automatically and not thinking about it. I do like how zsh warns you about rm * though with the directory you are about to remove though.
I don’t really want to be confirming every file in a recursive rm or cp or mv either
Ah but rm will only make you confirm if there are more than 3 files to be removed. And cp and mv only if there's risk of overwriting. And it's only one confirm per command, not per file.
You must have a different version of rm then I do:
$ rm -i a
rm: remove regular empty file 'a'? y
$ rm -ir f
rm: descend into directory 'f'? y
rm: remove regular empty file 'f/a'? y
rm: remove regular empty file 'f/b'? y
rm: remove regular empty file 'f/c'? y
rm: remove regular empty file 'f/d'? y
rm: remove regular empty file 'f/e'? y
rm: remove directory 'f'? y
Never really had an issue with cp or mv overwriting files where I didnt mean to. Possibly because I don't default recursive on all the time. So they tend to error when accidentality copying folders. And I tend to tab complete paths to see what is in them. I also tend to use rsync for copying large directories rather than just cp when the directories might not be empty to start with.
The problem I have with this kind of thing is: I work on hundreds of different vms and containers and they can't all be setup like this AND have root and system accounts be setup like this. So you get too used to it one place and forget its not there when trying to troubleshoot. These days i tend to try and keep my shell simple so my skills transfer easily anywhere.
You can source a script for this directly from github using curl and proccess substitution in order to temporarily have the config when and where you are without making it the default
If you're allowed docker in your systems, build a sysadmin container with all your favorite tools. Then just run it locally and remotely with the root directory bound to /mnt or something