perl 对bash中的目录进行排序

h4cxqtbf  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(153)

我想遍历每个目录的内容,并随机选择每个目录中的文件。代码运行良好。但是,当它遍历目录时,它不会以排序的方式处理它们。例如,我有一个名为Label_1Label_2Label_3,...,Label_83的目录,但当脚本运行时,它会回显Label_1Label_2Label_10,...我希望这个回显以一种排序的方式发生,就像Label_2应该是Label_3而不是label_10,因为它会影响train.list和test.list中的最终结果。有什么方法可以对这些目录进行排序,以便它以排序的方式写入输出文件吗?

#!/bin/bash
> train.list
> test.list
COUNT=-1
for folder in $1/*
do
        echo $folder
        COUNT=$[$COUNT + 1]
        for imagesFolder in "$folder"/*
        do
                if ( (( ( RANDOM % $2 )  ))  > 1 ); then
                        echo "$imagesFolder" $COUNT >> train.list
                else
                        echo "$imagesFolder" $COUNT >> test.list
                fi
                done
done
kokeuurv

kokeuurv1#

另一个解决方案是使用sort

for folder in $(printf '%s\n' $1/*/ | sort -V); do
    ...
xxe27gdn

xxe27gdn2#

一个解决方案是重命名之前的目录与000整数前缀:

find . -type d -name '*Label_*' -exec \
    rename 's/Label_(\d+)/sprintf "Label_%.03d", $1/e' {} \;


其他同名工具可能无法执行此操作,因此请小心。
如果运行以下命令(GNU

$ file "$(readlink -f "$(type -p rename)")"

如果结果中包含Perl script, ASCII text executable而不包含ELF,那么这似乎是正确的工具=)
如果不是,要使其默认(通常已经是这种情况)在Debian上并衍生为Ubuntu

$ sudo update-alternatives --set rename /path/to/rename

/path/to/rename替换为perl rename可执行文件的路径。
如果你没有这个命令,搜索你的软件包管理器来安装它或do it manually(no deps...)
这个工具最初是由Perl的父亲Larry Wall编写的。

相关问题