Skip to content

Instantly share code, notes, and snippets.

@travishen
Last active December 24, 2021 09:57
Show Gist options
  • Save travishen/d98c7e1f3d6a169b1694c3c5bdf94632 to your computer and use it in GitHub Desktop.
Save travishen/d98c7e1f3d6a169b1694c3c5bdf94632 to your computer and use it in GitHub Desktop.
Classic Shell Script 範例- find 的複雜版腳本
#! /bin/sh -
# 尋找所有文件及目錄
# 在目錄樹下,將最近修改過得文件加以組合
# 並於最上層的 FILES.* 與 DIRECTORIES.* 內建立列表
#
# 語法:
# filesdirectories directory
IFS='
'
# 確保先找 GNU 版本的 find,需要其 -fprint 選項
PATH=/usr/local/bin:/bin:/usr/bin
export PATH
if [ $# -ne 1 ]
then
echo "Usage: $0 directory" >&2
exit 1
fi
umask 077
TMP=${TMPDIR:-/tmp}
TMPFILES="
$TMP/DIRECTORIES.all.$$ $TMP/DIRECTORIES.all.$$.tmp
$TMP/DIRECTORIES.last01.$$ $TMP/DIRECTORIES.last01.$$.tmp
$TMP/DIRECTORIES.last07.$$ $TMP/DIRECTORIES.last07.$$.tmp
$TMP/DIRECTORIES.last31.$$ $TMP/DIRECTORIES.last31.$$.tmp
$TMP/FILES.all.$$ $TMP/FILES.all.$$.tmp
$TMP/FILES.last01.$$ $TMP/FILES.last01.$$.tmp
$TMP/FILES.last07.$$ $TMP/FILES.last07.$$.tmp
$TMP/FILES.last31.$$ $TMP/FILES.last31.$$.tmp
"
WD=$1
cd $WD || exit 1
trap 'exit 1' HUP INT PIPE QUIT TERM
trap 'rm -f $TMPFILES' EXIT
# 使用 -name 選項匹配前次執行的輸出文件名,而 -true 選項忽略會忽略這個操作,以免弄亂輸出報告
find . \
-name DIRECTORIES.all -true \
-o -name 'DIRECTORIES.last[0-9][0-9]' -true \
-o -name FILES.all -true \
-o -name 'FILES.last[0-9][0-9]' -true \
-o -type f -fprint $TMP/FILES.all.$$ \
-a -mtime -31 -fprint $TMP/FILES.last31.$$ \
-a -mtime -7 -fprint $TMP/FILES.last07.$$ \
-a -mtime -1 -fprint $TMP/FILES.last01.$$ \
-o -type d -fprint $TMP/DIRECTORIES.all.$$ \
-a -mtime -31 -fprint $TMP/DIRECTORIES.last31.$$ \
-a -mtime -07 -fprint $TMP/DIRECTORIES.last07.$$ \
-a -mtime -01 -fprint $TMP/DIRECTORIES.last01.$$
# 將每個報告行前綴的 ./ 替換成指定的工作目錄
for i in FILES.all FILES.last31 FILES.last07 FILES.last01 \
DIRECTORIES.all DIRECTORIES.last31 DIRECTORIES.last07 DIRECTORIES.last01
do
sed -e "s=^[.]/=$WD/=" -e "s=^[.]$=$WD=" $TMP/$i.$$ | LC_ALL=C sort > $TMP/$i.$$.tmp
cmp -s $TMP/$i.$$.tmp $i || mv $TMP/$i.$$.tmp $i
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment