Linux Find Command

ExamplesCreated by @dan_nanni on Instagram

find . -name “my.txt” find all files named “my.txt”

find .-type d-name “mydir” find all directories named “mydir”

find . -type f-name “*.jpg” find all “.jpg” files

find . -type f-size +100M find all files larger than 100MB

find . -type f-size +100M-size -500M find files with a specific size range

find . -type f-mtime-1 find all files modified in last 24 hours

find .-mtime-7-mtime +1 find files modified betn yesterday & a week ago

find . -type f-name “*.tmp” -delete find and remove all “.tmp” files

find . -type f-perm 0777 find all files with “777” permission

find . -type f-perm-u+x find all files executed by the user

find . -type f-name “*.txt” -exec cat {} \; find and cat all “*.txt” files

find . -type f-amin-60 find all files accessed within the last hour

find . -type f-user dan find all files owned by the user “dan”

find .-type f-ctime -2 find files created within last 2 days

find .-maxdepth 1 -name “my.txt” search only in current dir

find . -type f-name “*.txt” | xargs chmod 644 chmod all “.txt” to 644

find . -type f-name “*.jpg” | xargs tar -cf img.tgz archive all “.jpg” files

find . -type f-name “*.png” | xargs -I {} mv {} /tmp move all “.png” files

find . -type f-name “*.txt” | xargs grep “Hello” search for Hello in “.txt”

find .-xtypel-delete find and remove all broken symbolic links

find .-type d-empty-delete find and remove all empty directories

find .-newermt “2024-01-01”! -newermt “2024-03-15” use a time range

Backup script example, Auto Make directory, Prepare date file name, dump mySQL, Auto rename old backup files with index code, rsync data

#!/bin/bash
basedir=/var/backup/store
sqldir=$basedir/sql
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
export LANG=C

for dirs in $basedir
do
        [ ! -d "$dirs" ] && mkdir -p $dirs
done

for dirs in $sqldir
do
        [ ! -d "$dirs" ] && mkdir -p $dirs
done



param1=$(date +%Y-%m-%d-%H-%M-%S)

# Database Backup
sqlusername=root
sqlpassword=Z2PG82SMtQzD
mysqldump=/usr/bin/mysqldump
bwlimit=--bwlimit=100K
#bwlimit=

sqldbname=dbispconfig
sqlsavetarget=$sqldir/$sqldbname.sql
rm -rf $sqlsavetarget.7
mv $sqlsavetarget.6 $sqlsavetarget.7
mv $sqlsavetarget.5 $sqlsavetarget.6
mv $sqlsavetarget.4 $sqlsavetarget.5
mv $sqlsavetarget.3 $sqlsavetarget.4
mv $sqlsavetarget.2 $sqlsavetarget.3
mv $sqlsavetarget.1 $sqlsavetarget.2
mv $sqlsavetarget $sqlsavetarget.1
$mysqldump -u $sqlusername -p$sqlpassword --skip-lock-tables -R $sqldbname > $sqlsavetarget

/usr/bin/rsync -ah $bwlimit --delete /etc $basedir
/usr/bin/rsync -ah $bwlimit --delete /usr/local/ispconfig $basedir

Prevent duplicate shell script executions

Method #1, pidof

I have a /var/backup/systemBackup.sh for system backup.

edit /var/backup/runsystemBackup.sh

#!/bin/bash

if pidof -x "systemBackup.sh" >/dev/null; then
        echo "Process already running"
        exit 0
fi
/var/backup/systemBackup.sh  > /dev/null &

try run /var/backup/runsystemBackup.sh

Method #2, lock file

I have a /var/backup/systemBackup.sh for system backup.

edit /var/backup/runsystemBackup.sh

#!/bin/sh

lockdir=/tmp
BACKUP=/var/backup/systemBackup.sh
LOGGER=/usr/bin/logger

if [ ! -f /$lockdir/systemBackup.sh ]; then
        touch $lockdir/systemBackup.sh

        $BACKUP
        rm $lockdir/systemBackup.sh

else
        echo "systemBackup.sh already running"
        $LOGGER -d -t SYSTEM_Backup "systemBackup.sh already running"
fi

try run /var/backup/runsystemBackup.sh

Method #3, flock with cron job

# m h dom mon dow user  command
5 0  *  *  * flock -w 0 /tmp/sqlbackup.sh.lock /var/backup/systemBackup.sh

如何停止ubuntu在開機啟動時進入視窗模式,並限制為文字模式?

資料來源:https://askubuntu.com/questions/16371/how-do-i-disable-x-at-boot-time-so-that-the-system-boots-in-text-mode

編輯 /etc/default/grub

sudo nano /etc/default/grub

尋找這一行

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

更改為

GRUB_CMDLINE_LINUX_DEFAULT="text"

更新 GRUB 設定

sudo update-grub


For systems that use systemd

This is an additional step for systemd releases, e.g. Ubuntu 15.04, the steps above for grub are still necessary.

You need to tell systemd to not load the graphical login manager:

sudo systemctl enable multi-user.target --force
sudo systemctl set-default multi-user.target

You will still be able to use X by typing startx after you logged in.

Crontab 使用實例

資料來源:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html

實例1:每1分鐘執行一次myCommand

* * * * * myCommand

實例2:每小時的第3和第15分鐘執行

3,15 * * * * myCommand

實例3:在上午8點到11點的第3和第15分鐘執行

3,15 8-11 * * * myCommand

實例4:每隔兩天的上午8點到11點的第3和第15分鐘執行

3,15 8-11 */2 * * myCommand

實例5:每週一上午8點到11點的第3和第15分鐘執行

3,15 8-11 * * 1 myCommand

實例6:每晚的21:30重啟smb

30 21 * * * /etc/init.d/smb restart

實例7:每月1、10、22日的4 : 45重啟smb

45 4 1,10,22 * * /etc/init.d/smb restart

實例8:每週六、週日的1 : 10重啟smb

10 1 * * 6,0 /etc/init.d/smb restart

實例9:每天18 : 00至23 : 00之間每隔30分鐘重啟smb

0,30 18-23 * * * /etc/init.d/smb restart

實例10:每星期六的晚上11 : 00 pm重啟smb

0 23 * * 6 /etc/init.d/smb restart

實例11:每一小時重啟smb

*/1 * * * /etc/init.d/smb restart

實例12:晚上11點到早上7點之間,每隔一小時重啟smb

0 23-7 * * * /etc/init.d/smb restart

How do I find all files containing specific text on Linux with GREP?

Source: https://stackoverflow.com/questions/16956810/how-do-i-find-all-files-containing-specific-text-on-linux

Do the following:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r or -R is recursive,
  • -n is line number, and
  • -w stands for match the whole word.
  • -l (lower-case L) can be added to just give the file name of matching files.
  • -i stands for ignore case (optional in your case).

Along with these, --exclude--include--exclude-dir flags could be used for efficient searching:

  • This will only search through those files which have .c or .h extensions:grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
  • This will exclude searching all the files ending with .o extension:grep --exclude=\*.o -rnw '/path/to/somewhere/' -e "pattern"
  • For directories it’s possible to exclude one or more directories using the --exclude-dir parameter. For example, this will exclude the dirs dir1/, dir2/ and all of them matching *.dst/:grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"

This works very well for me, to achieve almost the same purpose like yours.

For more options check man grep.

Linux tar incremental Backup / Restore

Incremental Backup 增量備份

tar 需要一個 Snapshot(快照)文件來對照新舊檔案差異
  • 備份實例基礎資料
備份目標位置: /etc
備份儲存位置: /var/backup

備份快照文件: etc.snar
Day 1 備份儲存文件: etc.1.tar
Day 2 備份儲存文件: etc.2.tar 
Day 3 備份儲存文件: etc.3.tar  
  • 第一天執行備份,建立 /var/backup/etc.snar 快照文件
# tar -cvf /var/backup/etc.1.tar /etc -g /var/backup/etc.snar
  • 第二天執行備份,會根據/var/backup/etc.snar的快照文件與 /etc的差異準行備份
# tar -cvf /var/backup/etc.2.tar /etc -g /var/backup/etc.snar 
  • 第三天執行備份,會根據上一次的快照文件最後備份結果與 /etc的差異準行備份
# tar -cvf /var/backup/etc.3.tar /etc -g /var/backup/etc.snar  

Incremental Backup 總結

經過三天的備份,我們應該會得到以下文件

# cd /var/backup
# ls -l
 total 10324
 -rw-r--r-- 1 root root 9687040 Feb 13 19:26 etc.1.tar
 -rw-r--r-- 1 root root  389120 Feb 14 19:26 etc.2.tar
 -rw-r--r-- 1 root root  430080 Feb 15 19:42 etc.3.tar
 -rw-r--r-- 1 root root   63331 Feb 15 19:42 etc.snar

第一天的 etc.1.tar 為 full Backup檔
第二天的 etc.2.tar 為 Day 2 的 Incremental Backup檔
第三天的 etc.3.tar 為 Day 3 的 Incremental Backup檔
注意:etc.snar文檔不可以刪除,否則就不能夠進行之後的 Incremental Backup

Restore 恢復

在Restore過程中,無需要使用快照文件,但必須要由第一天開始順序提取
  • Restore實例基礎資料
etc.1.tar: full Backup檔
etc.2.tar: Day 2 的 Incremental Backup檔
etc.3.tar: Day 3 的 Incremental Backup檔
恢複的資料存放在 /home/foo

e.g.
# cd /var/backup
# ls -l
 total 10324
 -rw-r--r-- 1 root root 9687040 Feb 13 19:26 etc.1.tar
 -rw-r--r-- 1 root root  389120 Feb 14 19:26 etc.2.tar
 -rw-r--r-- 1 root root  430080 Feb 15 19:42 etc.3.tar
 -rw-r--r-- 1 root root   63331 Feb 15 19:42 etc.snar
# 
  • 實例恢復 Day2 的資料步驟
# tar -C /home/foo -xvf etc.1.tar -g /dev/null
# tar -C /home/foo -xvf etc.2.tar -g /dev/null 
  • 檢查恢複結果
# cd /home/foo
# ls -l
total 4
 drwxr-xr-x 125 root root 4096 Feb 16 13:16 etc
#

Restore 總結

# tar -C /home/foo -xvf etc.1.tar -g /dev/null 

使用 -g /dev/null 的目的,會根據記錄自動刪除已改變的檔案。
若不使用 -g /dev/null,tar不會協助您刪除已取消的檔案。

Linux tar 基礎實例

  • 把 /home/foo 備份到 foo.tar 文件中
tar -cf foo.tar /home/foo
tar -vcf foo.tar /home/foo

-c 或--create 建立新的備份文件。
-f<備份文件>或--file=<備份文件> 指定備份文件。
-v 或--verbose 顯示指令執行過程。 
  • 把多個目錄或檔案,備份到 foo.tar 文件中
 tar -cf foo.tar /home/foo1 /home/foo2 /home/foo3/abc.jpg 
  • 還原備份文件
tar -vxf foo.tar

-x 或--extract或--get 從備份文件中還原文件。
  • 還原備份文件到指定目錄 /home/abc
tar -C /home/abc -vxf foo.tar
  • 查看tar文件中的內容
tar -tvf foo.tar
  • 如何還原備份文件中部份文件夾
# 先查看tar文件中的內容 

tar -tvf foo.tar  

從 foo.tar 中,只提取 /home/foo2目錄,並存放在 /home/temp中

tar -C /home/temp -vxf foo.tar home/foo2  

#注意 home/foo2 前是沒有「/」符號

參考:

RINOOB.COM Linux Tar命令
How do you extract a single folder from a large tar.gz archive?