次のようなラベルが付いたフォルダがたくさんあります。
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
私の考えでは。数値グローバル修飾子をサポートしているので、1つあれば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スクリプトを作成します。
#!/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
し、それをシェル式として呼び出します。
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