番号順にフォルダを閲覧

番号順にフォルダを閲覧

次のようなラベルが付いたフォルダがたくさんあります。

 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

関連情報