In: Computers, technology.
Linux CLI snippets
Count lines
find . -type f -name '\*.py' | xargs wc -l
find . -type f -name '\*.js' | xargs wc -l
Remove files
Remove all files/directories except for one file:
find . ! -name 'file.txt' -type f -delete
ls -a | grep -v '.jpeg' | xargs rm -v
ls --hide=file.txt | xargs -d '\n' rm -v
Disks
## list disk devices
lsblk -rpo "name,type,fstype,size,mountpoint"
## list disks with details
sudo fdisk -l (or -x)
## disk usage (local, human readable)
df -hl
File sizes
## size of folders depth=1, with the total
du -h -d 1 /path/to/folder/
## size of files & folders of current dir, no total
du -sh -- *
## size of files 1 (sorted)
find /path/to/folder/ -type f -ls | sort -nr -k7
## size of files 2 (sorted)
find /path/to/folder/ -type f -exec du -ah {} + | sort -hr
## find specific extensions
find /path/to/folder/ -type f \( -name "\*.AVI" -o -name "\*.MP4" -o -name "\*.MOV" \) -print
find /path/to/folder/ -type f \( -name "\*.JPG" -o -name "\*.JPEG" -o -name "\*.PNG" -o -name "\*.GIF" \) -print
Mass rename
## test the pattern first, before doing anything stupid
file="File-123.JPEG" ; echo "${file/.JPE*G/.jpg}"
## replace all
file="Fileee-123.JPEG" ; echo "${file//e/E}"
## match beginning
file="Fileee-123.JPEG" ; echo "${file/#F/x}"
## match the end
file="Fileee-123.JPEG" ; echo "${file/%G/x}"
## deep mass rename
find /path/to/folder/ -type f -name '*.txt' -print0 | xargs -0 -n1 bash -c 'mv -v "$0" "${0/old/new}"'
find /path/to/folder/ -type f -name '*.JPEG' -print0 | xargs -0 -n1 bash -c 'mv -v "$0" "${0/.JPE*G/.jpg}"'
find /path/to/folder/ -type f -name '*.PNG' -print0 | xargs -0 -n1 bash -c 'mv -v "$0" "${0/.PNG/.png}"'
Mass delete DANGER
## delete deep !!
## can also use -maxdepth 2 or whatever
find /path/to/folder -type f -name '*.bak' -print -exec rm -vf {} \;
## OR
find /path/to/folder -type f -name '*.bak' -print -delete
Replace a string in multiple files
## using SED, same folder
cd /path/to/folder
sed -i '.bak' 's/old-word/new-word/g' *
## using SED, same folder
sed --debug -i 's@old_path@new_path@g' *
## deep find + sed
find . -type f -exec sed -i 's/old-word/new-word/' {} \;
## deep replace, case insensitive
grep -rli 'old-word' * | xargs -i@ sed -i 's/old-word/new-word/g' @
GPG manage keys
gpg --list-keys
gpg --list-secret-keys
gpg --delete-key ABC
gpg --delete-secret-key XYZ
## Export public & private keys
gpg --export --armor ABC > public.key # extensions: asc, key, pgp, txt
gpg --export --armor --output public.pgp ABC
gpg -a --export-secret-keys XYZ > secret-gpg.key
gpg --export-ownertrust > ownertrust-gpg.txt
## Import keys
gpg --import secret-gpg.key
gpg --import-ownertrust ownertrust-gpg.txt
## Announce keys on Key Servers
gpg --keyserver hkp://pgp.mit.edu --send-keys ...
gpg --keyserver hkp://pgp.surfnet.nl --send-keys ...