디렉토리의 처음 100개 파일을 연결하는 방법은 무엇입니까?

디렉토리의 처음 100개 파일을 연결하는 방법은 무엇입니까?

내 디렉터리에는 고유한 파일 이름을 가진 4000개의 텍스트 파일이 있습니다.

당신은 가지고 있습니까?리눅스 명령1-100 파일만 연결하세요.

cat 1.txt ... 100.txt > 1.100.txt
cat 101.txt ... 200.txt > 2.200.txt
.......
.......
cat 3901.txt ... 4000.txt > 40.4000.txt

제안해 주세요.

답변1

그리고 zsh:

files=( *(N.n) ) i=0
while (( $#files )) {
  () {cat -- $@ > $((++i)).$@[-1]} $files[1,100]
  files[1,100]=()
}

glob 한정자는 파일 이름을 숫자순으로 정렬하므로 수정 시간을 기준 으로 가장 오래된 것부터 최신 것 순 n으로 변경할 수 있습니다 .OmOm

답변2

head100개의 파일만 선택할 수 있습니다 .

예를 들어:

cat $(ls -1 --sort=time | head -n 100) > 1.100.txt

(다른 이름 --sort으로 변경하거나 )

파일 이름에 공백이나 줄 바꿈이 가능한 경우 사용할 수 없지만 안전 ls합니다 find -print0(구분자로 null 사용).

find . -type f -print0 | head -z -n 100 | xargs -0 cat > 1.100.txt

답변3

lsBash 루프에서 출력을 사용할 때는 출력이 항상 작동할 것이라는 잘못된 보안 감각을 줄 수 있으므로 주의해야 합니다 . (파일 이름의 공백이 어떻게 되는지 고려하십시오...) 이 경우에는 작동합니다. 그러나 파일 이름의 유일한 부분이 숫자이고 연속적인 경우 일반적으로 더 나은 방법이 있습니다(약간 더 복잡한 경우). 이 작업을 수행.

seqBash에는 원하는 작업을 수행하는 루프를 구성하는 데 사용할 수 있는 정수 수학 함수가 내장되어 있습니다 .

i=0
while :; do
    (( i += 1 ))
    (( i >= 4000 )) && break

    files_to_catenate=
    for i in $(seq $i $((i + 99))); do
        files_to_catenate+=( "${i}.txt")
    done
    cat "${files_to_catenate[@]}" > "$((i / 100)).${i}.txt"
done

답변4

조금 소름끼치지만 다음과 같이 실행할 수 있습니다.

for a in {1..40}
do 
  echo cat "{$((a*100-99))..$(($a*100))}.txt > $a.$(($a*100)).txt" 
done

에코

cat {1..100}.txt > 1.100.txt
cat {101..200}.txt > 2.200.txt
...
cat {3901..4000}.txt > 40.4000.txt

네가 이것을 좋아한다면:for a in.....done | bash

관련 정보