linux基礎之find、tar和sed用法

知識點:

find

Linux find命令用來在指定目錄下查找文件。任何位於參數之前的字符串都將被視爲欲查找的目錄名。如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。並且將查找到的子目錄和文件全部進行顯示。

語法

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

參數說明 :

pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
-print: find命令將匹配的文件輸出到標準輸出。
-exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲’command’ { } ;,注意{ }和\;之間的空格。
-ok: 和-exec的作用相同,只不過以一種更爲安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

#-print 將查找到的文件輸出到標準輸出
#-exec command {} ; —–將查到的文件執行command操作,{} 和 ;之間有空格
#-ok 和-exec相同,只不過在操作前要詢用戶

例:find . -name .svn | xargs rm -rf

====================================================

-name filename #查找名爲filename的文件
-perm #按執行權限來查找
-user username #按文件屬主來查找
-group groupname #按組來查找
-mtime -n +n #按文件更改時間來查找文件,-n指n天以內,+n指n天以前
-atime -n +n #按文件訪問時間來查GIN: 0px">

-ctime -n +n #按文件創建時間來查找文件,-n指n天以內,+n指n天以前

-nogroup #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在
-nouser #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer f1 !f2 找文件,-n指n天以內,+n指n天以前
-ctime -n +n #按文件創建時間來查找文件,-n指n天以內,+n指n天以前
-nogroup #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在
-nouser #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer f1 !f2 #查更改時間比f1新但比f2舊的文件
-type b/d/c/p/l/f #查是塊設備、目錄、字符設備、管道、符號鏈接、普通文件
-size n[c] #查長度爲n塊[或n字節]的文件
-depth #使查找在進入子目錄前先行查找完本目錄
-fstype #查更改時間比f1新但比f2舊的文件
-type b/d/c/p/l/f #查是塊設備、目錄、字符設備、管道、符號鏈接、普通文件
-size n[c] #查長度爲n塊[或n字節]的文件
-depth #使查找在進入子目錄前先行查找完本目錄
-fstype #查位於某一類型文件系統中的文件,這些文件系統類型通常可 在/etc/fstab中找到
-mount #查文件時不跨越文件系統mount點
-follow #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
-cpio %; #查位於某一類型文件系統中的文件,這些文件系統類型通常可 在/etc/fstab中找到
-mount #查文件時不跨越文件系統mount點
-follow #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
-cpio #對匹配的文件使用cpio命令,將他們備份到磁帶設備中
-prune #忽略某個目錄

tar

linux下最常用的打包程序就是tar了,使用tar程序打出來的包我們常稱爲tar包,tar包文件的命令通常都是以.tar結尾的。生成tar包後,就可以用其它的程序來進行壓縮。

1.命令格式:

tar[必要參數][選擇參數][文件]

2.命令功能:

用來壓縮和解壓文件。tar本身不具有壓縮功能。他是調用壓縮功能實現的

3.命令參數:

-A, --catenate       追加 tar 文件至歸檔
-c, --create      創建一個新歸檔
-r, --append      追加文件至歸檔結尾
-u, --update     僅追加比歸檔中副本更新的文件
-x, --extract, --get      從歸檔中解出文件
-t, --list      列出歸檔內容
-z, --gzip, --gunzip, --ungzip 通過 gzip 壓縮歸檔
-j, --bzip2    通過 bzip2 壓縮歸檔
-J, --xz     通過 xz 過濾歸檔
–lzip       通過 lzip 過濾歸檔
–lzma     通過 lzma 過濾歸檔
-Z, --compress, --uncompress 通過 compress 壓縮歸檔
-v, --verbose   詳細地列出處理的文件過程
-k, --keep-old-files    保留源文件不覆蓋
-m, --touch    不要解壓文件的修改時間
-W, --verify    在寫入以後嘗試校驗歸檔
f, --file=ARCHIVE   使用歸檔文件或 ARCHIVE 設備,這個參數是最後一個,後面只接文件名
-b, --blocking-factor=BLOCKS 設置每個記錄 BLOCKS x 512 字節
-C, --directory=DIR   改變至目錄 DIR
–help          顯示幫助信息
–version         顯示版本信息

4.用法

壓縮

  • tar –cvf jpg.tar *.jpg 將目錄裏所有jpg文件打包成tar.jpg
  • tar –czf jpg.tar.gz *.jpg 將目錄裏所有jpg文件打包成jpg.tar後,並且將其用gzip壓縮,生成一個gzip壓縮過的包,命名爲jpg.tar.gz
  • tar –cjf jpg.tar.bz2 *.jpg 將目錄裏所有jpg文件打包成jpg.tar後,並且將其用bzip2壓縮,生成一個bzip2壓縮過的包,命名爲jpg.tar.bz2
  • tar –cZf jpg.tar.Z *.jpg 將目錄裏所有jpg文件打包成jpg.tar後,並且將其用compress壓縮,生成一個umcompress壓縮過的包,命名爲jpg.tar.Z
  • rar a jpg.rar *.jpg rar格式的壓縮,需要先下載rar for linux
  • zip jpg.zip *.jpg zip格式的壓縮,需要先下載zip for linux

解壓

  • tar –xvf file.tar 解壓 tar包
  • tar -xzvf file.tar.gz 解壓tar.gz
  • tar -xjvf file.tar.bz2 解壓 tar.bz2
  • tar –xZvf file.tar.Z 解壓tar.Z
  • unrar e file.rar 解壓rar
  • unzip file.zip 解壓zip

總結

  1. *.tar 用 tar –xvf 解壓
  2. *.gz 用 gzip -d或者gunzip 解壓
  3. .tar.gz和.tgz 用 tar –xzf 解壓
  4. *.bz2 用 bzip2 -d或者用bunzip2 解壓
  5. *.tar.bz2用tar –xjf 解壓
  6. *.Z 用 uncompress 解壓
  7. *.tar.Z 用tar –xZf 解壓
  8. *.rar 用 unrar e解壓
  9. *.zip 用 unzip 解壓

sed

Linux sed 命令是利用腳本來處理文本文件。

sed 可依照腳本的指令來處理、編輯文本文件。

Sed 主要用來自動編輯一個或多個文件、簡化對文件的反覆操作、編寫轉換程序等。

語法

sed [-hnV][-e<script>][-f<script文件>][文本文件]

參數說明

  • -e

動作說明

  • a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
  • c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
  • d :刪除,因爲是刪除啊,所以 d 後面通常不接任何咚咚;
  • i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
  • p :打印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~
  • s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

作業練習:

1、查找/etc目錄下大於1M且類型爲普通文件的所有文件

# 知識點 find
# 一步一步來,我們先找出/etc下所有普通文件
[flamenca@localhost ~]$ find /etc -type f
...
/etc/sane.d/teco2.conf
/etc/sane.d/teco3.conf
/etc/sane.d/test.conf
/etc/sane.d/u12.conf
/etc/sane.d/umax.conf
/etc/subgid-
/etc/nfs.conf
# 出來一大堆
# 但題目中還說要文件大小大於1M的普通文件
# 所以.. 
[root@localhost ~]# find /etc/ -type f -size +1M
/etc/udev/hwdb.bin
/etc/selinux/targeted/contexts/files/file_contexts.bin
/etc/selinux/targeted/policy/policy.31
/etc/selinux/targeted/active/policy.kern
/etc/selinux/targeted/active/policy.linked
/etc/brltty/zh-tw.ctb

2、打包/etc/目錄下面所有conf結尾的文件,壓縮包名稱爲當天的時間,並拷貝到/usr/local/src目錄備份。

# 知識點 tar
# conf 結尾 *.conf
# 當天時間怎麼表示呢? `date +%F`
# 我們試一試
[root@localhost ~]# date +%F
2020-03-23

# 所以答案我們顯而易見
# 但還是慢慢來比較穩妥
# 先打包
[root@localhost ~]# tar -cvf `date +%F`.tar /etc/*.conf
tar: Removing leading '/ ' from member names
/etc/asound.conf
/etc/autofs.conf
/etc/autofs_ldap_auth.conf
/etc/brltty.conf
/etc/cgconfig.conf
/etc/cgrules.conf
/etc/cgsnapshot_blacklist.conf
/etc/chrony.conf
/etc/dleyna-server-service.conf
/etc/dnsmasq.conf
...

# 注意:tar: Removing leading '/ ' from member names
# 這一句,是爲啥出現的呢?什麼意思?
# 其原因是tar默認爲相對路徑,使用絕對路徑的話就回報這個錯,可以使用-P參數(注意大寫)解決這個問題

# 打包好了,我們開始複製咯
[root@localhost etc]# tar -zvcPf `date +%F`.tar.gz /etc/*.conf && cp `date +%F`.tar.gz /usr/local/src
/etc/asound.conf
/etc/autofs.conf
/etc/autofs_ldap_auth.conf
/etc/brltty.conf
/etc/cgconfig.conf
/etc/cgrules.conf
/etc/cgsnapshot_blacklist.conf
...
#檢查一下
[root@localhost etc]# cd /usr/local/src
[root@localhost src]# ls
2020-03-23.tar.gz

3、利用sed 取出ifconfig命令中本機的IPv4地址

# 知識點 sed
# 這個簡單,只要用好正則表達式基本答案就出來了
# 首先我們要找到那一行,並觀察特徵作出正則表達式
# 比如我的
[root@localhost src]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.4  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::298d:cfea:e788:42bb  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:5b:fc:1e  txqueuelen 1000  (Ethernet)
        RX packets 3926  bytes 891637 (870.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1109  bytes 175715 (171.5 KiB)
# ipv4的地址在第二行,在inet後面,特徵是有數字有點,後面跟了一些東西,用.*表示
# 所以我們可以這樣
[root@localhost src]# ifconfig ens33 |sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
192.168.1.4
# 仔細看一下這個s參數後面的東西s/^[^0-9]+([0-9.]+).*/\1/p

# 解釋一下哈,我們知道前面內容^[^0-9]+([0-9.]+).*是來表示第二行內容的
# 而([0-9.]+)是代表IP地址的寫法,且用括號分組了
# 之後的 /\1/p 是打印這部分的內容

4、刪除/etc/fstab文件中所有以#開頭,後面至少跟一個空白字符的行的行首的#和空白字符

# 知識點 sed
# 還是老樣子,寫出題目要求的正則表達式內容,就做出來了
# 你看啊,其實題目要的效果就是去除#和空格,留下之後的內容,所有我們將之後的內容括號分組

# s/^#[[:space:]]+(.*)/\1/
# 就這樣

[root@localhost src]# sed -r 's/^#[[:space:]]+(.*)/\1/' /etc/fstab 

#
/etc/fstab
Created by anaconda on Thu Dec 26 14:35:01 2019
#
Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=499c0046-6a79-4a41-9297-533134c65bf4 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名

# 知識點 sed
# 這個簡單,這個取得路徑方法很簡單,還是正則表達式
# 基名和目錄名兩塊這麼來寫 (/.*)/(.*) 看着特抽象是不是?
# 以兩個括號中間的 / 作爲切入點看,右邊的不就是基名,左邊的都是目錄名

# 咱們先取個基名吧
[root@localhost src]# echo /etc/fstab |sed -nr 's@(/.*)/(.*)@\2@p'
fstab
# 格式不是 s///嘛,爲了看起來清楚點,我給改成s@@@了

# 取目錄名吧
[root@localhost src]# echo /etc/fstab |sed -nr 's@(/.*)/(.*)@\1@p'
/etc

# 完事了嗷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章