Linux 下三種提高工作效率的文件處理技巧


在 Linux 下工作,打交道最多的就是文件了,畢竟 Linux 下工作一切皆文件嘛。Linux 也為大家提供了多種用於處理文件的命令,合理使用這些命令可以大大節省你的時間,並讓我們的工作負擔不再那麼沉重。

尋找文件的技巧


當我們查找文件時,第一時間想到的肯定是 find 命令。但是如果我們搜索的路徑範圍比較大時,花費的時間會比較多,在這個情況下 find 命令就不是最優的方式了。

我們可以使用 ls 快速找到近期更新的文件。比如,想知道自己昨天離開辦公室回家前調用的腳本嗎?小case嘛!使用 ls 命令並加上 -ltr 選項。最後一個列出的將是最近創建或更新的文件。

<code>$ ls -ltr ~/bin | tail -3
-rwx------ 1 shs shs   229 Sep 22 19:37 checkCPU
-rwx------ 1 shs shs   285 Sep 22 19:37 ff
-rwxrw-r-- 1 shs shs  1629 Sep 22 19:37 test2/<code>

如果我們僅僅想列出今天更新的文件,可以這樣操作:

<code>$ ls -al --time-style=+%D | grep `date +%D`
drwxr-xr-x  60 shs  shs       69632 09/23/19 .
drwxrwxr-x   2 shs  shs     8052736 09/23/19 bin
-rw-rw-r--   1 shs  shs         506 09/23/19 stats/<code>

如果我們想要查找的文件可能不在當前目錄中,那麼 find 將比 ls 更加靈活強大。但是,find 命令的輸出結果可能會比較多,我們可以使用它的一些選項來過濾掉自己不想要的結果。

比如,在下面的命令中,我們不搜索以點開頭的目錄(即隱藏目錄),指定我們要查找的是文件而不是目錄,並要求僅顯示最近一天更新過的文件。

命令如下:

<code>$ find . -not -path '*/\\.*' -type f -mtime -1 -ls
   917517      0 -rwxrw-r--   1 shs      shs          683 Sep 23 11:00 ./newscript/<code>

注意 -not 選項反轉了 -path 的行為,因此我們不會搜索以點開頭的子目錄。

如果我們只想查找最大的文件和目錄,那麼可以使用類似 du 這樣的命令,它會按大小列出當前目錄的內容。然後,再將輸出的內容通過管道傳輸到 tail 命令,僅查看最大的幾個。

<code>$ du -kx | egrep -v "\\./.+/" | sort -n | tail -5
918984      ./reports
1053980     ./notes
1217932     ./.cache
31470204    ./photos
39771212    ./<code>

-k 選項讓 du 以塊列出文件大小,而 x 可防止其遍歷其他文件系統上的目錄(例如,通過符號鏈接引用)。命令運行後,du 命令會先列出文件大小,然後再調用 sort -n 來按照大小排序。

統計文件數量的技巧


使用 find 命令可以很容易地計數任何特定目錄中的文件。不過大家要注意的是,find 會遞歸到子目錄中,並將這些子目錄中的文件與當前目錄中的文件一起計數。

比如,我們想計數一個特定用戶(alvin)的主目錄中的文件,我們可以先用 find 命令找到文件,再用 wc 命令進行統計。

<code>$ find /home/alvin -type f 2>/dev/null | wc -l
35624/<code>

請注意,我們將 find 命令的錯誤輸出發送到 /dev/null,為了避免搜索類似 ~/.cache 這類無法搜索並且對它的內容也不感興趣的文件夾。

必要時,我們可以使用 -maxdepth 1 選項將 find 搜索範圍限制在單個目錄中,或者也可以將其設置為自己想要搜索的深度:

<code>$ find /home/alvin -maxdepth 1 -type f | wc -l
387/<code>


文件重命名的技巧


使用 mv 命令可以很容易地重命名一個文件,但是有時我們想重命名大量文件,並且不想花費大量時間,要怎麼操作呢?這個時候 rename 命令就要派上用場了。

例如,我們想要將當前目錄下所有文件的文件名中含有空格的全部更改為下劃線,大家可以使用如下命令:

<code>$ rename 's/ /_/g' */<code>

大家應該能想到,此命令行中的 g 代表「全局」。這就意味著該命令會將文件名中的所有空格更改為下劃線,而不僅僅是第一個。

如果我們想要把文本的文件刪除掉 .txt 擴展名,可以使用如下命令:

<code>$ rename 's/.txt//g' */<code>
<code>

/<code>


分享到:


相關文章: