所以,我犯了一個小錯誤。在從來源收集資料的過程中,我將所有內容轉儲到外部磁碟的根目錄中,該磁碟現在擁有大約 600k+ 檔案(總共 23 GB)。以下是我想做的幾個選項:
- 將一定數量的檔案從磁碟移到我的硬碟。
- 建立子資料夾(每個子資料夾包含 1000 個檔案)並在它們之間分發檔案。
- 將整個文件或部分文件(例如 50,000 個文件)打包並移動到我的磁碟上。
但無論我嘗試做什麼,似乎都需要永遠。有人可以幫助我了解執行這些操作的最佳/最有效的方法嗎?謝謝。
答案1
下面將建立一個名為 的子目錄new
,然後建立 50 個編號為..的new
子目錄。然後,它將最多將 1000 個檔案從目前目錄移至每個目錄中。new/01
new/50
new/*
註 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 -1
xargs
mv
#! /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