내 디렉터리에는 고유한 파일 이름을 가진 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
으로 변경할 수 있습니다 .Om
O
m
답변2
head
100개의 파일만 선택할 수 있습니다 .
예를 들어:
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
ls
Bash 루프에서 출력을 사용할 때는 출력이 항상 작동할 것이라는 잘못된 보안 감각을 줄 수 있으므로 주의해야 합니다 . (파일 이름의 공백이 어떻게 되는지 고려하십시오...) 이 경우에는 작동합니다. 그러나 파일 이름의 유일한 부분이 숫자이고 연속적인 경우 일반적으로 더 나은 방법이 있습니다(약간 더 복잡한 경우). 이 작업을 수행.
seq
Bash에는 원하는 작업을 수행하는 루프를 구성하는 데 사용할 수 있는 정수 수학 함수가 내장되어 있습니다 .
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