linux - 文件查找及壓縮


文件查找:

1.  which    查找可以執行文件,只搜索$PATH里的目錄

$ which ls
/bin/ls

which只搜索$PATH里的目錄,如果搜索當前目錄的文件是沒有任何結果的

$ ls -l
總用量 0
-rw-rw-r-- 1 huanghao huanghao 0  3月  1 12:24 a.txt
$ which a.txt

2. whereis    與which差不多,只不過它會查找幫助文件,還會查找庫文件

$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz

$ whereis libip6tc.so.0
libip6tc.so: /lib/libip6tc.so.0

#搜索一個文件,不管文件存在不存在,返回結果永遠是不帶擴展名的文件名+ :
$ whereis b.txt       
b:

3. slocate,  locate

這兩個放在一起說,是因為slocate實際上軟鏈接到了locate,它倆是一樣的,ubuntu里是mlocate

# locate passwd
/etc/passwd
/etc/passwd-
/etc/cron.daily/passwd
/etc/init/passwd.conf
/etc/pam.d/chpasswd
/etc/pam.d/passwd
/etc/security/opasswd
/home/huangxm/passwd
/home/huangxm/passwd-
/home/huangxm/cron.daily/passwd
/home/huangxm/init/passwd.conf

它把所有包含passwd的文件都查找出來了,我們新建一個文件newfile.txt,查找一下

# locate newfile.txt

卻沒有返回任何結果,可以newfile.txt明明存在,但它是剛剛創建的。實際上locate並不是在文件系統里查找文件,而是在它的數據庫/var/lib/slocate/slocate.db中查,ubuntu 是 /vra/lib/mlocate/mlocate.db 

接下來更新一下該數據庫

# updatedb
# locate newfile.txt
/home/huanghao/test/newfile.txt

找到了,所以如果數據庫不更新,locate是無法查找到新創建的文件的;但是總不能每次使用都更新db吧。 所以linux中每天有計划任務來更新db,看一下

# pwd
/etc/cron.daily
# ll mlocate 
-rwxr-xr-x 1 root root 435  6月 20  2013 mlocate*

在每天的任務中有一個mlocate*的任務,打開看一下

#! /bin/bash

set -e

[ -x /usr/bin/updatedb.mlocate ] || exit 0

if which on_ac_power >/dev/null 2>&1; then
    ON_BATTERY=0
    on_ac_power >/dev/null 2>&1 || ON_BATTERY=$?
    if [ "$ON_BATTERY" -eq 1 ]; then
        exit 0
    fi
fi

# See ionice(1)
if [ -x /usr/bin/ionice ] &&
    /usr/bin/ionice -c3 true 2>/dev/null; then
    IONICE="/usr/bin/ionice -c3"
fi

flock --nonblock /run/mlocate.daily.lock $IONICE /usr/bin/updatedb.mlocate
~

先不管能不能看懂,最后有updatedb的操作。

4. find   這個就是踏踏實實的從硬盤查找文件了

# find newfile.txt             #在當前目錄中查找

# find / -name a.txt        #從/開始查找文件a.txt

# find / -name "*newfile*'"     #從/開始查找所有包含newfile的文件

# find / -name "*newfile*'"   -ls      #查找並列出文件屬性

# find / -name "*newfile*'"   -exec file {} \;  #查找並執行file命令 {}的意思是將查找的結果放進去

# find / -name "*newfile*'" -ok rm {} \;   #查找並刪除,-ok是提示需要交互, -exec是不提示,直接執行

find /home -user shrek -ls     #查找屬於用戶shrek的文件並列出來

find /home -user shrek -a -group shrek -a -type d -ls    #查找屬於用戶shrek並且屬於組shrek的目錄 -a是and的意思

#其它參數
-user   -group   -type  -perm 權限     -size 大小  -mtime 時間
-a and     -o or

詳細看一下權限查找

#  find / -perm +777  -type d -ls

權限是用9位二進制數表示的,+777 的意思是指9位中任何一位有1的權限,通俗點說就是任意權限

# find / -perm -777 -type d –ls
-777 的意思是所有位都是1,即查找777權限的目錄,這個操作還是很有用的。

5. grep   這個是查找文件內容的

# grep root /etc/passwd   #在passwd中查找包含root的行
root:x:0:0:root:/root:/bin/bash
# grep -R root /etc              #在/etc下所有文件及子文件中查找
/etc/anacrontab:HOME=/root
/etc/anacrontab:LOGNAME=root
/etc/cron.weekly/man-db:    chown man:root /var/cache/man || true
/etc/shadow:root:$6$TXA2sjeg$/yQGd91.Fq0kF6RNkT.sHkCzdwGs8yU4UczEnVAO.Td7sBweenU.R0Gcn2DBwXhos/n6tircXjxWkl.3voaLA.:16847:0:99999:7:::

上面遞歸查找時顯示了很多內容,如果我們只想顯示包含查找內容的文件,可加l參數

# grep -R -l root /etc
/etc/anacrontab
/etc/cron.weekly/man-db
/etc/shadow
/etc/sysctl.d/10-kernel-hardening.conf
/etc/passwd
/etc/group
/etc/cron.daily/man-db
/etc/cron.daily/apt
/etc/grub.d/20_linux_xen
/etc/grub.d/30_os-prober
/etc/grub.d/20_memtest86+
/etc/grub.d/05_debian_theme

總結一下:

1.  如果查找可執行文件,用which

2.  locate查找文件速度非常快,但是需要更新db,如果沒有更新,可能查不到最新的文件

3.  find 很強,但是查找速度慢

4.  如果要查找文件中的內容,用grep

 

文件壓縮及解壓

1. gzip      壓縮成.gz, 原文件會被刪除 , 壓縮率較高

    gunzip   解壓

    gzip –d   和上面一樣,解壓

$ ls -l
總用量 0
-rw-rw-r-- 1 huanghao huanghao 0  3月  1 12:24 a.txt
-rw-rw-r-- 1 huanghao huanghao 0  3月  1 12:30 newfile.txt

$ gzip a.txtt$ ls -l
總用量 4
-rw-rw-r-- 1 huanghao huanghao 26  3月  1 12:24 a.txt.gz
-rw-rw-r-- 1 huanghao huanghao  0  3月  1 12:30 newfile.txt
$ gzip -d a.txt.gz 
$ ll
總用量 8
drwxrwxr-x  2 huanghao huanghao 4096  3月  1 13:55 ./
drwxr-xr-x 19 huanghao huanghao 4096  3月  1 12:24 ../
-rw-rw-r--  1 huanghao huanghao    0  3月  1 12:24 a.txt
-rw-rw-r--  1 huanghao huanghao    0  3月  1 12:30 newfile.txt

bzip2     bunzip2        bunzip2 –d     壓縮率比gzip高

$ bzip2 a.txt
$ ls -l
總用量 4
-rw-rw-r-- 1 huanghao huanghao 14  3月  1 12:24 a.txt.bz2
-rw-rw-r-- 1 huanghao huanghao  0  3月  1 12:30 newfile.txt

$ bzip2 -d a.txt.bz2 
$ ls -l
總用量 0
-rw-rw-r-- 1 huanghao huanghao 0  3月  1 12:24 a.txt
-rw-rw-r-- 1 huanghao huanghao 0  3月  1 12:30 newfile.txt

tar命令

tar本來是打包命令,是將一系列文件及文件夾打包,現在tar命令也可以用來壓縮,先看一下有哪些參數

-c 創建打包文件
-v 將打包過程輸出
-x 解包
-r 將文件添加到已存在的tar包中
-t 查看包內容
-z 壓縮
$ tar cvf a.tar .
./
./a.txt
tar: ./a.tar: 文件是歸檔文件;未輸出
./newfile.txt

后面的.是指當前目錄, 將當前目錄打包成a.tar,並存放在當前目錄中

$ ls -l
總用量 12
-rw-rw-r-- 1 huanghao huanghao 10240  3月  1 14:00 a.tar              #這個是打包文件
-rw-rw-r-- 1 huanghao huanghao     0  3月  1 12:24 a.txt   
-rw-rw-r-- 1 huanghao huanghao     0  3月  1 12:30 newfile.txt

來看一下打包文件的內容

$ tar tvf a.tar 
drwxrwxr-x huanghao/huanghao 0 2016-03-01 14:00 ./
-rw-rw-r-- huanghao/huanghao 0 2016-03-01 12:24 ./a.txt
-rw-rw-r-- huanghao/huanghao 0 2016-03-01 12:30 ./newfile.txt
$ tar cvf b.tar ~/test
tar: 從成員名中刪除開頭的“//home/huanghao/test/
/home/huanghao/test/a.txt
/home/huanghao/test/a.tar
/home/huanghao/test/newfile.txt
$ tar -tvf b.tar 
drwxrwxr-x huanghao/huanghao 0 2016-03-01 14:00 home/huanghao/test/
-rw-rw-r-- huanghao/huanghao 0 2016-03-01 12:24 home/huanghao/test/a.txt
-rw-rw-r-- huanghao/huanghao 10240 2016-03-01 14:00 home/huanghao/test/a.tar
-rw-rw-r-- huanghao/huanghao     0 2016-03-01 12:30 home/huanghao/test/newfile.txt

這里壓縮包的內容里文件都帶上了路徑,注意這兩種方式的區別。

當然也可以將不同目錄的文件打包到一個文件中:

$ tar cvf b.tar a.txt /etc/passwd
a.txt
tar: 從成員名中刪除開頭的“//etc/passwd

解壓:

$ tar xvf a.tar             #解壓到當前文件夾
./
./a.txt
./newfile.txt
$ tar xvf a.tar -C ./a  #解壓到當前目錄的目錄a中
./
./a.txt
./newfile.txt

 

打包並壓縮’

$ tar cvfz c.tar.gz /etc/passwd a.txt     #也可以打包壓縮不同目錄的文件
tar: 從成員名中刪除開頭的“//etc/passwd
a.txt

同樣解壓也可以用-C解壓到其它目錄中

$ tar xvfz c.tar.gz -C ./a
etc/passwd
a.txt


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM