我正在嘗試列出編號最小的所有子目錄。
例如,對於以下列表:
/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
注意:當第二個目錄具有不同的數字時,此腳本將失敗