1. 程式人生 > >2.23-2.26 查找文件和文件名後綴

2.23-2.26 查找文件和文件名後綴

centos linux

2.23-2.26 查找文件和文件名後綴

在Linux下搜一個文件

1、‘which’ 用來查找可執行文件的絕對路徑

which只能用來查找PATH環境變量中出現的路徑下的可執行文件。這個命令用的也是蠻多的,有時候我們不知道某個命令的絕對路徑,which 一下很容易就知道了。

2、‘whereis’ 通過預先生成的一個文件列表庫去查找跟給出的文件名相關的文件。

語法: whereis [-bmsu] [文件名稱]

‘-b’ : 只找binary 文件

‘-m’ : 只找在說明文件manual路徑下的文件

‘-s’ : 只找source來源文件

‘-u’ : 沒有說明檔的文件

說明:whereis平時不常用,因為搜索不精準。

3、‘locate’ 類似於’whereis’, 也是通過查找預先生成的文件列表庫來告訴用戶要查找的文件在哪裏。

後邊直接跟文件名。如果我們的linux沒有這個命令,請安裝軟件包 ‘mlocate’,如果使用的是centos,可以使用這個命令來安裝 yum install -y mlocate。

技術分享圖片

這是因為系統還沒有生成那個文件列表庫。可以使用 updatedb 命令立即生成(更新)這個庫。如果服務器上正跑著重要的業務,那麽最好不要去運行這個命令,因為一旦運行,服務器的壓力會變大。這個數據庫默認情況下每周更新一次。所以用locate命令去搜索一個文件,正好是在兩次更新時間段內,那肯定是得不到結果的。可以到/etc/updated.conf 去配置這個數據庫生成(更新)的規則。’locate’所搜索到的文件列表,不管是目錄名還是文件名,只要包含我們要搜索的關鍵詞,都會列出來,所以’locate’不適合精準搜索,這個命令也不常用。

4、find命令,最常用的搜索命令。

語法 : find [路徑] [參數]

選項:

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

-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 #忽略某個目錄

用法:

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

find -name april* 在當前目錄下查找以april開始的文件

find -name april* fprint file 在當前目錄下查找以april開始的文件,並把結果輸出到file中

find -name ap* -o -name may* 查找以ap或may開頭的文件

find /mnt -name tom.txt -ftype vfat 在/mnt下查找名稱為tom.txt且文件系統類型vfat的文件

find /mnt -name t.txt ! -ftype vfat 在/mnt下查找名稱為tom.txt且文件系統類型不為vfat的文件

find /tmp -name wa* -type l 在/tmp下查找名為wa開頭且類型為符號鏈接的文件

find /home -mtime -2 在/home下查最近兩天內改動過的文件

find /home -atime -1 查1天之內被存取過的文件

find /home -mmin +60 在/home下查60分鐘前改動過的文件

find /home -amin +30 查最近30分鐘前被存取過的文件

find /home -newer tmp.txt 在/home下查更新時間比tmp.txt近的文件或目錄

find /home -anewer tmp.txt 在/home下查存取時間比tmp.txt近的文件或目錄

find /home -used -2 列出文件或目錄被改動過之後,在2日內被存取過的文件或目錄

find /home -user cnscn 列出/home目錄內屬於用戶cnscn的文件或目錄

find /home -uid +501 列出/home目錄內用戶的識別碼大於501的文件或目錄

find /home -group cnscn 列出/home內組為cnscn的文件或目錄

find /home -gid 501 列出/home內組id為501的文件或目錄

find /home -nouser 列出/home內不屬於本地用戶的文件或目錄

find /home -nogroup 列出/home內不屬於本地組的文件或目錄

find /home -name tmp.txt -maxdepth 4 列出/home內的tmp.txt 查時深度最多為3層

find /home -name tmp.txt -mindepth 3 從第2層開始查

find /home -empty 查找大小為0的文件或空目錄

find /home -size +512k 查大於512k的文件

find /home -size -512k 查小於512k的文件

find /home -links +2 查硬連接數大於2的文件或目錄

find /home -perm 0700 查權限為700的文件或目錄

find /tmp -name tmp.txt -exec cat {} \;

find /tmp -name tmp.txt -ok rm {} \;

find / -amin -10 # 查找在系統中最後10分鐘訪問的文件

find / -atime -2 # 查找在系統中最後48小時訪問的文件

find / -empty # 查找在系統中為空的文件或者文件夾

find / -group cat # 查找在系統中屬於 groupcat的文件

find / -mmin -5 # 查找在系統中最後5分鐘裏修改過的文件

find / -mtime -1 #查找在系統中最後24小時裏修改過的文件

find / -nouser #查找在系統中屬於作廢用戶的文件

find / -user fred #查找在系統中屬於FRED這個用戶的文件

常用參數:

‘-atime +n/-n’ : 訪問或執行時間大於/小於n天的文件。

‘-ctime +n/-n’ : 寫入、更改inode屬性(例如更改所有者、權限或者鏈接)時間大於/小於n天的文件。

‘-mtime +n/-n’ : 寫入時間大於/小於n天的文件。

技術分享圖片

三個time屬性:

文件的 Access time也就是 ‘atime’ 是在讀取文件或者執行文件時更改的。文件的 Modified time也就是 ‘mtime’ 是在寫入文件時隨文件內容的更改而更改的。文件的 Create time也就是 ‘ctime’ 是在寫入文件、更改所有者、權限或鏈接設置時隨inode的內容更改而更改的。 因此,更改文件的內容即會更改mtime和ctime,但是文件的ctime可能會在 mtime 未發生任何變化時更改,例如,更改了文件的權限,但是文件內容沒有變化。 如何獲得一個文件的atime mtime 以及ctime ?

‘stat’ 命令可用來列出文件的 atime、ctime 和 mtime

技術分享圖片

atime不一定在訪問文件之後被修改,因為:使用ext3文件系統的時候,如果在mount的時候使用了noatime參數那麽就不會更新atime的信息。總之, 這三個 time stamp 都放在 inode 中。若 mtime, atime 修改inode 就一定會改, 既然 inode 改了, 那 ctime 也就跟著要改了。

‘-name filename’ 直接查找該文件名的文件,這個選項使用很多

技術分享圖片

在tmp下搜索txt後綴的文件:

技術分享圖片

‘-type filetype’ 通過文件類型查找

技術分享圖片


Linux文件類型與擴展名

PS:在linux下,我們可以定義一個文件的後綴名,如.txt和.log這種,但它並不像windows那樣,是這個後綴名就等於是這種文件。只是後綴名而已。

列如:我們touch新建了一個文件起名為1.doc,但是放在windows裏並不能用word打開它,所以後綴並不能定義一個文件的類型,有時候只是為了好區分。

文件種類

最前面的標誌(d或 -)可以表示目錄或文件,那就是不同的文件種類。Linux的文件種類主要有下面這幾種:

? 普通文件(regular file):就是一般我們存取的文件,由ls -al顯示出來的屬性中,第一個屬性為 [-],例如 [-rwxrwxrwx]。另外,依照文件的內容,又大致可以分為:

? 純文本文件(ASCII):這是Unix系統中最多的一種文件類型,之所以稱為純文本文件,是因為內容為我們可以直接讀到的數據,例如數字、字母等等。設置文件幾乎都屬於這種文件類型。舉例來說,使用命令“cat ~/.bashrc”就可以看到該文件的內容(cat是將文件內容讀出來)。

? 二進制文件(binary):我們在GNU發展史中提過,系統其實僅認識且可以執行二進制文件(binary file)。Linux中的可執行文件(腳本,文本方式的批處理文件不算)就是這種格式的。舉例來說,命令cat就是一個二進制文件。

? 數據格式的文件(data):有些程序在運行過程中,會讀取某些特定格式的文件,那些特定格式的文件可以稱為數據文件(data file)。舉例來說,Linux在用戶登入時,都會將登錄數據記錄在 /var/log/wtmp文件內,該文件是一個數據文件,它能通過last命令讀出來。但使用cat時,會讀出亂碼。因為它是屬於一種特殊格式的文件。

? 目錄(directory):就是目錄,第一個屬性為 [d],例如 [drwxrwxrwx]。

? 連接文件(link):類似Windows下面的快捷方式。第一個屬性為 [l],例如 [lrwxrwxrwx]。

? 設備與設備文件(device):與系統外設及存儲等相關的一些文件,通常都集中在 /dev目錄。通常又分為兩種:

? 塊(block)設備文件:就是存儲數據以供系統存取的接口設備,簡單而言就是硬盤。例如一號硬盤的代碼是 /dev/hda1等文件。第一個屬性為 [b]。

? 字符(character)設備文件:即串行端口的接口設備,例如鍵盤、鼠標等等。第一個屬性為 [c]。

? 套接字(sockets):這類文件通常用在網絡數據連接。我們可以啟動一個程序來監聽客戶端的要求,客戶端就可以通過套接字來進行數據通信。第一個屬性為 [s],最常在 /var/run目錄中看到這種文件類型。

? 管道(FIFO, pipe):FIFO也是一種特殊的文件類型,它主要的目的是,解決多個程序同時存取一個文件所造成的錯誤。FIFO是first-in-first-out(先進先出)的縮寫。第一個屬性為 [p]。

那麽,使用“ls -al”命令,就可以簡單通過判斷每一個文件的第一個屬性來了解這個文件是何種類型。

除了設備文件是系統中很重要的文件,最好不要隨意修改之外(通常它也不會讓你修改),另一個比較有趣的文件就是連接文件。如果常常將應用程序放到桌面,就應該知道在Windows下面有所謂的“快捷方式”。同樣,可以將Linux 下的連接文件簡單視為一個文件或目錄的快捷方式。套接字與管道文件比較難理解,因為它們與進程(process)密切相關,到將來了解進程(第17章)之後,再回來查看吧。此外,也可以通過man fifo及man socket來查看系統說明。

Linux文件擴展名

基本上,Linux文件是沒有“擴展名”的,我們知道,Linux文件能否執行,與它第一列的10個屬性有關,與文件名一點關系也沒有。這與Windows不同。在Windows中,能執行的文件擴展名通常是 .com、.exe、.bat等等,而在Linux中,只要屬性中有x,例如 [-rwx-r-xr-x] 即表示這個文件可以執行。

不過,可以執行與可執行成功是不一樣的。舉例來說,在root家目錄下的install.log是一個純文本文件,如果修改權限成為 -rwxrwxrwx後,這個文件能執行嗎?當然不行。因為它的內容根本就沒有可執行的數據。所以說,x表示這個文件具有可執行的能力,但能不能執行成功,當然就要看該文件的內容。

雖然擴展名沒有什麽實際的幫助,不過,由於我們仍然希望可以通過擴展名來了解該文件是什麽,所以,通常還是會以適當的擴展名來表示該文件是什麽類型。下面有數種常用的擴展名:

? *.sh:批處理文件(scripts,腳本),因為批處理文件使用shell寫成,所以擴展名就編成 .sh。

? *Z, *.tar, *.tar.gz, *.zip, *.tgz:經過打包的壓縮文件。這是因為壓縮軟件分別為gunzip、tar等等的,根據不同的壓縮軟件而取其相關的擴展名。

? *.html, *.php:網頁相關文件,分別表示HTML語法與PHP語法的網頁文件。.html的文件可使用網頁瀏覽器來直接打開, .php的文件則可以通過客戶端的瀏覽器來瀏覽服務器端,以得到運算後的網頁結果。

Linux文件名的限制

一般來說,在設置Linux下的文件名時,最好避免一些特殊字符。例如下面這些:

* ? > < ; & ! [ ] | / ' " ` ( ) { }

因為這些符號在命令行界面下是有特殊意義的。另外,文件名的開頭為小數點“.”時,表示這個文件為“隱藏文件”。同時,由於命令中常常會使用 -option之類的參數,所以最好也避免將文件名的開頭以 - 或 來命名。


2.23-2.26 查找文件和文件名後綴