我有一堆以这种方式标记的文件夹:
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