Linux |僅複製目錄和嵌套目錄中的前 100 個新文件

Linux |僅複製目錄和嵌套目錄中的前 100 個新文件

我在 AzureVM/Ubuntu 上有如下所示的存儲

-/A
   -/B --> 10000 log files
   -/C --> 100000 log files 
      -/D --> 200000 images 
   summary.xml
   -/data --> 1000 csv files

現在,由於資料量非常大,無法進行計算和執行任何操作,因此我想取得該資料的樣本來開發我的資料分析程式碼。

我想將一個子集複製到另一個位置,其中每個目錄和嵌套目錄中有 100 個最新文件,以及根目錄上的所有文件,如下所示。

-/New_Location
   -/B --> 100 log files
   -/C --> 100 log files 
       -/D --> 100 images 
   summary.xml
   -/data --> 100 csv files

我嘗試了多個基於 cp 的命令,但沒有任何效果對我有用,並且執行時間太長。

有人可以幫我嗎?

答案1

您通常可以將其分為三個任務,從目錄結構開始,然後根據您的情況,將檔案限制為 100 個。匹配擴大其餘文件的範圍。

#!/bin/bash  
  
# Example START  
[[ ! -d A/ ]] && { \  
mkdir -p \  
A/{tmp/folder,\  
{A..Z}}/{images,data} && \  
printf %s\\0 \  
A/{summary.xml,\  
tmp/De5Loh4X.tmp,\  
{A..Z}/{{1..1000}_file.log,\  
images/{1..1000}_pic.{jpg,png},\  
data/example.csv}} | xargs -0 touch; }  
### Example END  
  
set -o noglob  
  
source=A  
target=target  
number=100  
# prune="-false"  
prune="-type d -path $source/tmp -prune"  
match='-name *.log -o -name *.jpg -o -name *.png'  
  
echo Create directory structure.  
find "$source" \  
\( $prune -o -type d -links 2 \) -printf %P\\0 | cpio -0 -pvdm -D "$source" "$target"  
  
  
echo Copy 100 files.  
while IFS= read -rd ''; do  
find "$REPLY" \  
-maxdepth 1 -type f \( $match \) -printf '%T@\t%P\0' | sort -zk1rn | cut -zf2- | head -zn $number | cpio -0 -pvdm -D "$REPLY" "$target/${REPLY/#$source\//}"  
done < <( \  
find "$source" \  
\( $prune -false -o -type f \) -printf %h\\0 | sort -zu \  
)  
  
echo Copy everything else.  
find "$source" \  
\( $prune -false -o -type f ! \( $match \) \) -printf %P\\0 | cpio -0 -pvdm -D "$source" "$target"

答案2

這可以透過選擇性歸檔輕鬆完成。您可以對檔案進行壓縮包(僅限目標檔案),然後將壓縮包解壓縮到其他位置。我假設您的日誌檔案除了編號之外具有相同的名稱(例如 log1、log2 等)。因此,前一百個檔案可以在 tarball 指令中定義為 log{1..100}。例如:

tar -cvf copied.tar <path1>/log{1..100} <path2>/log({1..100}ETC

解壓縮時,原始文件結構將在新位置重新建立。因此,您可能需要使用“--strip-components=”選項來截斷多餘的前導目錄以避免混亂。

相關內容