---
# System prepended metadata

title: "Bash Ninja \U0001F977"
tags: [bash, mac]

---

# Bash Ninja 🥷

###### tags: `mac` `bash`

[TOC]

### Learn about stuff
```bash
# short description
whatis stuff

# long version
info stuff
man stuff
```
while in a man page, Type slash `/` and then type the string to search for. Keep pressing `n` to get to the next item.

```bash
stuff -h
stuff --help

# retrieve commands to see examples on how to write them
history | grep 'git'
```
another way to do it is to trigger ‘reverse-i-search’ press `ctrl` + `r`  in terminal


### Piping & Command Substitution

execute a command and feed it as input to another command
```bash
# with ` `
file `which python`

# with $()
pth=$(which python)
file $pth

# with piping, i.e. "|"
which python | xargs file
````

#### with `-exec`
```bash
# find files of size 0 and remove them
find . -size 0 -exec rm -i {} \;
```
`{}` is replaced by each file name found in the executed command
`\;` is for delimiting the end of the exec command

[:link: more on exec](https://superuser.com/questions/1072679/bash-what-does-means#:~:text=%7B%7D%20has%20absolutely%20no%20meaning,the%20command%20executed%2C%20here%20find%20.&text=It%20is%20normally%20used%20to,on%20the%20same%20command%20line.)

### Operators
```bash
# run command1, wait for it to finish and run command2
command1 ; command2

# same but command1 has to exit successfully (no errors)
commmand1 && command2

# write to file
find ~/Documents > search_log.txt

# append to file
find ~/Code >> search_log.txt
```

[:link: more on operators](https://unix.stackexchange.com/questions/159513/what-are-the-shells-control-and-redirection-operators)

### View content & Explore files

#### view

```bash
# in terminal
cat ./file # useful for greping, e.g. cat ./file | grep 'string'
less ./file # simple and fast

# in apps
subl -n ./file # Sublime
code ./file # VS Code
```


#### compare
```bash
code -dn ./file1 ./file2
```

### Find stuff
```bash
# searches for "possibly useful" binaries and sources
whereis stuff

# only searches for executables
which stuff
```

Find all files (`-type f`), ending with '.xml' and discard the errors (e.g. permission denied)
```bash
sudo find / -type f -name '*.xml' 2>/dev/null
```

Redirect error spam to null and store the rest in output.txt
```bash
find . -name "data*.txt" -print 2>/dev/null > output.txt
```

display as `ls` list
```bash
sudo find /Users/simon/.config/ -type f -name '*.xml' 2>/dev/null -exec ls -Ghla {} \;
```

counts lines of code in a project
```bash
find . -type f -name "*.py" -exec wc -l {} \;
```

dump it to sum

### Move / Rename stuff

move all content (files & directories)
```bash 
mv -v ~/Downloads/* ~/Documents/
```

To move all files, but not folders:
```bash
find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Documents
````

To move only files from the Downloads folder, but not from sub-folders:

```bash
find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Documents
```

### Permissions

#### attributes
| Permissions | No permission | Execute | Write | Write and execute | Read | Read and execute | Read and write | Read, write and execute |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Octal notation | `0` | `1` | `2` | `3` | `4` | `5` | `6` | `7` |
| Symbolic notation | `---` | `--x` | `-w-` | `-wx` | `r--` | `r-x` | `rw-` | `rwx` |
| Binary notation | `000` | `001` | `010` | `011` | `100` | `101` | `110` | `111` |

```bash
# example
chmod 755 ./file
chmod -R 755 ./dir
```

#### users
```bash
whoami

chown bob ./file
```

#### privilege escalation
```bash
sudo chown bob ./file
```

### Tasks & Processes

```bash
# see processes
top

# alternative (brew install htop)
htop

# kill process with PID
kill 68984

# kill processes which name include
killall python3

# look for running tasks, get PID
ps aux | grep python3

# look for proccesses on a specific port & kill it
lsof -ti:8890 | xargs kill -9
```

### Environment Variables

```bash
# list environment variables
printenv
env

# set variable 
export PYTHONPATH="$PWD/code"

# print variable
echo $PYTHONPATH

# search variable
env | grep PYTHON
```

### Disk Management
Format USB stick to work with both Windows and Mac file systems (using exFAT)
```bash 
# list drives to get disk identifiers
diskutil list

# formatting command
diskutil eraseDisk FILE_SYSTEM DISK_NAME DISK_IDENTIFIER

# example
diskutil eraseDisk ExFAT DiskName /dev/DiskNodeID
```

### Subshell command

execute commands in a subshell with `(<commands>)` when you don't want them to affect your current shell, *e.g.*:
```bash
(cd /usr/share/doc && find * -name index.html)
```

### Miscellaneous

```bash
# display PATH
echo $PATH

# get all aliases
alias
# for one command
alias ls

# bypass aliases from .bash_profile
command ls

# see users
less /etc/passwd
```