查找编号最小的子目录

查找编号最小的子目录

我正在尝试列出编号最小的所有子目录。

例如,对于以下列表:

/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

注意:当第二个目录具有不同的数字时,此脚本将失败

相关内容