尋找編號最小的子目錄

尋找編號最小的子目錄

我正在嘗試列出編號最小的所有子目錄。

例如,對於以下列表:

/100/2001  
/100/2003  
/101/2001  
/101/2004  
/102/2000  
/102/2003  
/102/2005  

我只想獲得:

/100/2001  
/101/2001  
/102/2000

答案1

對於每個目錄中的最低目錄,您需要對每個目錄中的輸出進行排序。

/100/2001
/100/2003
/101/2001
/101/2004
/102/2000
/102/2003
/102/2005

ls 指令會自動執行此操作,但預設會進行字母數字排序。如果所有子目錄的名稱長度相同,那麼這是可以接受的。

SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do ls -d $SUBDIR/???? | head -1 done

工作原理: for SUBDIR in $SUBDIRLIST
查看清單中的每個目錄。此列表在上一行中定義。我選擇使用10?選擇長度為 3 個字元並以 10 開頭的條目,但SUBDIR=*如果您想使用所有內容,您也可以直接說。

ls -d $SUBDIR/????

  • ls指令顯示 $SUBDIR 內容的排序項目
  • 僅選擇????四個字元長的條目。如果您不關心,或者如果您有其他應該忽略的目錄,您可能想要選擇 *,請使用類似的表達式進一步限制它20??

| head -1 - 透過「head 指令」傳遞清單 - Head 將只顯示第一行並丟棄其餘的。

如果所有目錄名稱的長度不同,您需要稍微不同的解決方案,例如:
SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do find $SUBDIR -depth 1 | sort -n | head -1 done

在本例中,我們使用 find 因為 ls 會對條目進行排序,但它會做錯,所以它是多餘的。尋找不對條目進行排序(預設)。

sort -n然後對找到的項目進行排序,-n確保將它們視為數字,以便 20 位於 100 之前。

再次head -1丟棄除第一行之外的所有內容。

最後,該SUBDIRLIST=10?語句僅選擇以 10 開頭且名稱包含三個字元的子目錄。您可以根據您的需求或多或少地限制它。例如SUBDIRLIST=*選擇所有內容,SUBDIRLIST=???選擇具有三個字元的所有條目。

答案2

這應該可以解決問題:

ls -1d /*/200{0,1}

輸出:

/100/2001
/101/2001
/102/2000

答案3

對於此輸入,可以透過以下方式完成:

awk -F/ 'min[$2]==0 { min[$2]=$3; next; }; 
 { if (min[$2]>$3) min[$1]=$3;}; 
 END {for (val in min) { print "/" val "/" min[val] };}'

awk按第一個欄位排序。我不知道這是有保證的還是只是巧合。確保您可以將 awk 輸出透過管道傳輸到

sort --field-separator=/ -n

答案4

像這樣的東西嗎?

for firstdir in `ls .`; do
  seconddir=`ls -1 ./$firstdir | head -n 1`
  echo $firstdir/$seconddir
done

注意:當第二個目錄具有不同的數字時,此腳本將失敗

相關內容