按数字顺序遍历文件夹

按数字顺序遍历文件夹

我有一堆以这种方式标记的文件夹:

 conf1
 conf2
 ...

但主目录中的顺序是这样的

 conf1
 conf10
 conf100
 conf101
 ...
 conf2
 conf20
 conf200
 conf201
 ...

因为每个文件夹都包含一个名为“distance.txt”的文件,所以我希望能够从每个文件夹打印 distance.txt 文件的内容,但按顺序从文件夹 1-->2--> 3...到最终文件夹272。

我尝试了几次,但每次最终文件都以错误的顺序包含所有值集;这是我设置的一段代码:

   ls -v | for d in ./*/; 
     do (cd "$d" && cat distance.txt >> /path/to/folder/d.txt
         );
     done

正如你所看到的,我尝试使用命令“排序”文件夹

ls -v

然后耦合循环以迭代地保存每个文件。

你能帮我一下吗?

答案1

对于这样一组相对较小的文件夹,您可以使用数字循环

for n in {1..272}
do
    d="conf$n"
    test-d "$d" && cat "$d/distance.txt" >> /path/to/folder/d.txt
done

答案2

如果您有sort支持空分隔符和版本排序的,您可以安全地执行

printf '%s\0' conf*/ | sort -zV | while read -rd '' d; do 
  whatever with "$d"
done

我认为。如果有的话zsh会更容易,因为它支持数字全局限定符

for d in conf*(/n); do
  whatever with "$d"
done

答案3

printf '%s\n' conf{1..101} conf{2..272} |
xargs sh -c 'shift "$1"; printf "%s/distance.txt\n" "$@"' 2 1 > /path/to/folder.txt

或者,

printf '%s\n' conf{1..101}/distance.txt conf{2..272}/distance.txt |
xargs cat > /path/to/folder.txt

答案4

创建一个小 perl 脚本来对 shell 传递的参数进行排序:

#!/usr/bin/perl -l -s

$re ||= qr/(\d+)/;

sub bynum {
   ($aa) = $a =~ $re;
   ($bb) = $b =~ $re;
   return $aa <=> $bb;
}

map { print } sort bynum @ARGV;

将脚本另存为sortargsbynum并将其调用为 shell 表达式:

for d in $(sortargsbynum conf*); do
   cat $d/distance.txt >> /path/to/folder/d.txt
done

您可以传递特殊的正则表达式进行匹配,例如仅匹配名称末尾的数字:

for d in $(sortargsbynum -re='(\d+)$' *conf*); do
   echo $d
done

conf1
conf2
conf10
conf20
conf99
1stconf100
2ndconf100
conf101
conf200
conf201

相关内容