Last active
December 24, 2021 09:57
-
-
Save travishen/d98c7e1f3d6a169b1694c3c5bdf94632 to your computer and use it in GitHub Desktop.
Classic Shell Script 範例- find 的複雜版腳本
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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