번호순으로 폴더 탐색

번호순으로 폴더 탐색

다음과 같은 라벨이 붙은 폴더가 많이 있습니다.

 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 스크립트를 만듭니다.

#!/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

관련 정보