我正在尝试列出编号最小的所有子目录。
例如,对于以下列表:
/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
注意:当第二个目录具有不同的数字时,此脚本将失败