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 ...
×