是否有一種優雅而快速的方法來複製某個目錄結構,並僅選擇隨機數量的檔案進行複製。例如你有這樣的結構:
--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 {} \;
, 哪個
- 建立目標目錄
- 複製隨機數量的文件。
在本例中,將複製 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
為目標目錄或使用第三個腳本選項。
這個概念驗證正在我的測試目錄中運行,但可能還有很多需要改進的地方。