複製具有隨機數量檔案的目錄結構

複製具有隨機數量檔案的目錄結構

是否有一種優雅而快速的方法來複製某個目錄結構,並僅選擇隨機數量的檔案進行複製。例如你有這樣的結構:

--MainDir
  --SubDir1
    --SubSubDir1
      --file1
      --file2
      --...
      --fileN
    --...
    --SubSubDirN
      --file1
      --file2
      --...
      --fileN
  --...

我想複製整個資料夾結構,但僅從每個 SubSubDir 的 {files1-filesN} 中選擇特定數量的隨機檔案進行複製。

答案1

既然你將其標記為linux我將假設 GNU 實用程式。

將目錄結構從$src複製到$dest

find "$src" -type d -print0 | cpio -padmv0 "$dest"

$nfile也從以下每個葉子目錄複製檔案的隨機樣本$src

find "$src" -type d -links 2 -exec \
    sh -c 'find "$1" -type f -print0 | shuf -z -n "$2"' sh {} "$nfiles" \; | \
    cpio -padmv0  "$dest"

這裡第一個find尋找葉子目錄 ( -links 2),然後第二個find尋找每個子目錄中的檔案。 shuf選擇隨機的文件樣本,最後cpio複製它們。

答案2

首先找到所有目錄:

find MainDir -type d

然後將這些目錄解析為腳本

find MainDir -type d -exec ./randomCopy.sh 2 {} \;

, 哪個

  1. 建立目標目錄
  2. 複製隨機數量的文件。

在本例中,將複製 2 個隨機檔案。

在我的範例中,腳本randomCopy.sh如下所示:

#!/bin/bash                                                                                                                                                                                                                                                                    
cnt="$1"                                                                                                                                                                                                                                                                     
dir="$2"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
mkdir -p "TARGET/$dir"                                                                                                                                                                                                                                                       

# see: https://stackoverflow.com/questions/414164/how-can-i-select-random-files-from-a-directory-in-bash                                                                                                                                                                     
find "$dir" -maxdepth 1 -type f | sort -R | tail -n $cnt | while read file; do                                                                                                                                                                                               
  # copy the file                                                                                                                                                                                                                                                            
  cp "$file" "TARGET/$dir/"
done

並且不要忘記使腳本可執行:chmod +x randomCopy.sh

將字串替換TARGET為目標目錄或使用第三個腳本選項。

這個概念驗證正在我的測試目錄中運行,但可能還有很多需要改進的地方。

相關內容