
我有大量的電子書,而且非常雜亂。其中一些單獨存在於自己的目錄中,一些已損壞,一些目錄為空。如何從所有這些不同的目錄中收集我的電子書,並將它們全部放在一個資料夾中,以便我可以閱讀和重新組織它們?我更喜歡使用本機 GNU 命令或 bash 腳本。
答案1
我假設您至少將所有這些都放在單一父資料夾下的各個子目錄中。就像是~/mybooks
。如果是這樣,您可以這樣做:
find ~/mybooks -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +
.pdf
這將找到名稱以或.epub
在目錄中結尾的所有檔案或目錄~/mybooks
,並將它們移至目錄中~/newdir
。如果您可以擁有名稱以.pdf
或結尾的目錄.epub
,請新增-type f
指令以僅取得檔案:
find ~/mybooks -type f -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +
答案2
若要將目錄樹(即遞歸地在目錄及其子目錄中)中具有特定副檔名的所有檔案移至單一目錄,在 zsh 中:
mv -i source/**/*.(pdf|epub) destination/
該destination
目錄必須已經存在。source/
如果要收集目前目錄及其子目錄下的文件,可以省略該部分。如果您想要移動所有檔案(無論其名稱為何),但不移動目錄:
mv -i source/**/*(.) destination/
在bash中:
shopt -s extglob globstar
mv -i source/**/*.@(pdf|epub) destination/
如果您有很多文件,這些命令可能會抱怨命令列太長。在這種情況下,您可以呼叫find
而不是使用遞歸通配符。
find source -name '*.pdf' -o -name '*.epub' -exec mv -i -t destination/ {} +
find source -type f -exec mv -i -t destination/ {} +
如果現有的目錄結構攜帶一些訊息,那麼您可能會發現創建更方便,而不是移動文件硬連結或者符號連結。
要建立硬鏈接,請調用ln
而不是mv -i
.透過硬鏈接,每個文件將同時出現在兩個位置。如果刪除原始文件或新文件,另一個文件將保留:文件的兩個位置處於平等地位。您可以判斷某個檔案具有硬鏈接,因為 輸出中第二列中的數字ls -l
大於 1。
要建立符號鏈接,首先變更到目標目錄,然後呼叫ln -s
using .
(代表目前目錄)作為目標。符號連結是一個文件,它只是說「看看那邊的這個文件」。如果刪除符號鏈接,不會影響原始檔案。如果移動或刪除原始文件,符號連結將變為懸掛狀態(即它仍然存在,但不再指向文件)。
若要刪除目錄下的空目錄,可以使用
find /some/directory -depth -type d -empty -delete