如何從包含大量文件的資料夾複製/壓縮檔案?

如何從包含大量文件的資料夾複製/壓縮檔案?

所以,我犯了一個小錯誤。在從來源收集資料的過程中,我將所有內容轉儲到外部磁碟的根目錄中,該磁碟現在擁有大約 600k+ 檔案(總共 23 GB)。以下是我想做的幾個選項:

  1. 將一定數量的檔案從磁碟移到我的硬碟。
  2. 建立子資料夾(每個子資料夾包含 1000 個檔案)並在它們之間分發檔案。
  3. 將整個文件或部分文件(例如 50,000 個文件)打包並移動到我的磁碟上。

但無論我嘗試做什麼,似乎都需要永遠。有人可以幫助我了解執行這些操作的最佳/最有效的方法嗎?謝謝。

答案1

下面將建立一個名為 的子目錄new,然後建立 50 個編號為..的new子目錄。然後,它將最多將 1000 個檔案從目前目錄移至每個目錄中。new/01new/50new/*

註 1:如果出現以下任一情況,則該方法將不起作用檔案名稱\n其中有換行符 ( ) 。

注意2:這需要 GNUxargs和 GNU mv。您運行的是 Linux,所以這些是標準的。

您可以更改數字(50 和 1000)和基本目錄以滿足您的需求。

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"
done

如果您想要移動的檔案全部符合特定模式,那麼您可以使用查找-name-regex選項來選擇它們。緊跟在-type f.之後新增選項。例如,如果您只想移動.txt檔案:

find . -maxdepth 1 -type f -name '*.txt' | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"

非 GNU 版本無法使用mv -t.它也不能使用xargs -d選項,但您可以使用tr '\n' '\0'將換行符轉換為 NUL 字元以供輸入- 同樣,這可以處理檔案名稱中 xargs -0r沒有 的任何檔案。是非 posix,是 的 freebsd 擴展,您可以安全地刪除該選項,但操作會運行得慢很多。\n-R -1xargsmv

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | tr '\n' '\0' | xargs -0r -R -1 -I % mv % "$BASEDIR/$i"
done

相關內容