Delete the broken symbolicfind -L . -type l -print -exec rm -rf {} \;
Replace contents by using sed# Replace all
sed -i "" "s|pattern|replace|g" "file.ext" # osx
sed -i"" "s|pattern|replace|g" "file.ext" # linux
# Replace the first line string
sed -i "" "1s|pattern|replace|g" "file.ext" # osx
sed -i"" "1s|pattern|replace|g" "file.ext" # linux
# Replace with \t
sed -i "" $'1s|pattern|\t|g' "file.ext" # osx
sed -i"" $'1s|pattern|\t|g' "file.ext" # linux
Delete files or folders except the specified onerm -rf !("Except 1"|"Except 2"|"Except N")
'=' and '==' in if statement#!/bin/bash
if [ "foo" = "foo" ]; then
echo expression evaluated as true
else
echo expression evaluated as false
fi
# or
#!/bin/bash
if [[ "foo" == "foo" ]]; then
echo expression evaluated as true
else
echo expression evaluated as false
fi
Get the modified time of file# osx
stat -f "%Sm" -t "%Y%m%dT%H%M%S" filename # datetime
stat -f "%Sm" -t "%s" filename # timestamp in seconds
# linux
stat -c %y filename # datetime
stat -c %Y filename # timestamp in seconds
Datetime and timestamp# Datetime
echo `date '+%Y-%m-%d %H:%M:%S.%N'`
# Timestamp in seconds
echo `date '+%s'`
# Elapsed time
STARTs=`date '+%s'`
STARTn=`date '+%N' | sed 's/^0*//'`
echo "Do something"
ENDs=`date '+%s'`
ENDn=`date '+%N' | sed 's/^0*//'`
SECS=$(($ENDs - $STARTs))
NANO=$(($ENDn - $STARTn))
if (( $NANO < 0 )); then
NANO=$((1000000000 + $NANO))
SECS=$(($SECS - 1))
fi
echo "Cost $SECS.$NANO seconds."
Check os typeif [[ "$OSTYPE" == "linux-gnu" ]]; then
# ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
# Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
# POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
# Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
# I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
# ...
else
# Unknown.
fi
Read file from arguments or stdincontent=""
while read line
do
content="${content}\n${line}"
done < "${1:-/dev/stdin}"
echo $content
#or
file=${1--}
content=$(cat $file)
echo $content
The substitution ${1:-...} takes $1 if defined,
otherwise the file name of the standard input of the own process is used.
Function return value# Define a function
myfunc() {
return 1
}
# Call the function
myfunc
# Get the result from the last command,
# here is the result of `myfunc`
result=$?
Remove duplicate string(no comma contains) from listfor string in $list; do unique[$string]=1; done
echo ${!unique[@]}
Read file# entire file
content=`cat filename.txt`
echo $content
# read line by line
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < filename.txt
Batch rename as numericn=1
for i in $(ls | sort -n);
do
newfile=$(printf "%03d%s" $n .${i##*.})
mv "${i}" "${newfile}"
echo "${i} -> ${newfile}"
((++n))
done
Format numberprintf "%05d\n" 52
Remove string charsoriginal="Hello World"
world="${original:6}"
hell="${original::4}"
hello="${original::-6}"
lo_wo="${original:3:-3}"
For loop# For loop
for (( i=0; i<10; i++ )); do echo "$i"; done
# For loop range
# {START..END..INCREMENT}
for i in {1..10..2}; do echo "$i"; done
# For loop through files with spaces
for i in *; do echo "$i"; done;
for i in *.ext; do echo "$i"; done;
# For loop through ls results only show extension
for i in $(ls); do echo "${i##*.}"; done;
# For loop through ls results only show filename
for i in $(ls); do echo "${i%.*}"; done;
# For loop through ls results sort as numeric
for i in $(ls | sort -n); do echo "$i"; done;
List files as numeric sortls | sort -n
Batch renamefor i in *.ext;
do mv "$i" "${i%.ext}.newext";
done
Modify permissionsudo chown -R root:wheel [file|dir]
Lock & Unlock (macOS)# lock
chflags -R uchg *
# unlock
chflags -R nouchg *
Delete unversioned files under svnsvn status --no-ignore | grep '^\?' | sed 's/^\? //'
svn status --no-ignore | grep '^\?' | sed 's/^\? //' | xargs -Ixx rm -rf xx
Find# Find and delete empty folders
find . -type d -empty -delete
# Find over 100MB files and sort
find / -type f -size +100M -exec ls -lh {} \; | sort -n -r
# Find files between the specified dates and copy them to the specified folder
find . -type f -newermt '2018-05-25' ! -newermt '2018-05-26' | xargs -I {} cp {} "folder/"