다음과 같은 라벨이 붙은 폴더가 많이 있습니다.
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