從幾個不同的目錄收集文件並將它們放在一個地方

從幾個不同的目錄收集文件並將它們放在一個地方

我有大量的電子書,而且非常雜亂。其中一些單獨存在於自己的目錄中,一些已損壞,一些目錄為空。如何從所有這些不同的目錄中收集我的電子書,並將它們全部放在一個資料夾中,以便我可以閱讀和重新組織它們?我更喜歡使用本機 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 -susing .(代表目前目錄)作為目標。符號連結是一個文件,它只是說「看看那邊的這個文件」。如果刪除符號鏈接,不會影響原始檔案。如果移動或刪除原始文件,符號連結將變為懸掛狀態(即它仍然存在,但不再指向文件)。

若要刪除目錄下的空目錄,可以使用

find /some/directory -depth -type d -empty -delete

相關內容