디렉토리에는 특정 수의 파일이 있습니다. 53개의 txt 파일이 있을 수 있지만 123개의 파일이 있을 수도 있습니다. 파일에는 다양한 임의의 이름이 있지만 모두 파일 핸들이 있습니다..txt
ls를 사용하여 모든 파일 목록을 가져와 변수에 넣을 수 있습니다.
list_of_txt_files=$(ls *.txt)
하지만 목록을 각각 10개의 요소만 포함하는 여러 개의 개별 목록으로 분할하고 싶습니다. 즉, 53개의 txt 파일이 있는 폴더에는 6개의 목록이 제공되어야 합니다. 이것은 10개의 파일 이름이 있는 5개의 목록과 3개의 파일 이름이 있는 6번째 목록입니다. 반면 디렉터리에 123개의 txt 파일이 있는 예제에서는 10개의 파일 이름이 있는 12개의 목록과 3개의 파일 이름만 포함된 13번째 목록이 제공되어야 합니다.
53개의 txt 파일을 예로 들어 숫자를 나열해 보세요. 1은 10번째 파일과 목록 번호까지 첫 번째 파일을 유지합니다. 2는 11번째 파일부터 20번째 파일까지 저장하는 식입니다. 나는 다른 사람들이 목록을 다르게 분해하고 싶어할 수도 있다고 생각했기 때문에 목록의 i번째 요소에서 j번째 요소까지 내 문제의 이름을 지정했습니다. 어쩌면 디렉토리의 첫 번째 파일부터 100번째 파일까지일 수도 있습니다.
최종 목표는 for do 루프에서 이러한 목록을 사용할 수 있고 cat 명령을 사용하여 10개 파일로 구성된 각 목록의 내용을 10개 파일로 구성된 각 세트의 하나의 파일에 기록하는 것입니다. 즉, 제 예에서는 53개의 파일과 디렉토리가 있으므로 6개의 파일이 제공됩니다. 처음 5개 파일에는 원본 txt 파일 50개의 내용이 포함되어 있고, 여섯 번째 파일에는 마지막 나머지 3개 txt 파일의 내용이 포함되어 있습니다.
head 또는 tail 명령 사용을 고려했지만 둘 중 하나에 대한 범위를 지정하는 방법을 잘 모르겠습니다.
답변1
껍질에정렬, 그것을 써. Bash에서 말해보세요:
$ touch {01..53}
$ files=(*)
$ echo "${files[@]:0:10}"
01 02 03 04 05 06 07 08 09 10
$ for ((i = 0 ; i < ${#files[@]} ; i += 10 )) ; do
echo "${files[@]:i:10}" ;
# or
# cat "${files[@]:i:10}" > set-$(( i / 10 ))
done
01 02 03 04 05 06 07 08 09 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53
이것하위 문자열 확장(배열 슬라이스)는 "${files[@]:i:10}"
단일 문자열이 아닌 단어 목록으로 확장되므로 반복할 수 있습니다.
for f in "${files[@]:i:10}" ; do
somecmd "$f"
done
아니요do 는 files=$(ls *.txt)
완전히 ls
중복되므로 쉘은 어쨌든 와일드카드를 평가합니다. 일반적으로 와일드카드 패턴을 변수( pat=*.txt
)에 저장하고 필요할 때 (따옴표 없이) 사용하거나, 실제 파일 이름으로 확장하려면 일반 POSIX에 국한되지 않는 경우 파일 이름 목록을 처리하려면 를 사용합니다 echo *.txt
. ls
쉘이면 배열이 더 좋을 것입니다.
및 를 사용 하여 head
목록을 분할 하려면 행 11~20을 가져오는 것과 같은 tail
작업을 수행해야 합니다 . | head -20 | tail -10
또는 sed: 를 사용하세요 | sed -n 11,20p
.
답변2
Bourne과 유사한 쉘(그러나 Bourne 쉘은 위치 요소에 액세스할 수 없음 $9
)을 사용하여 다음을 수행할 수 있습니다.
set -- *.txt
while [ "$#" -gt 0 ]; do
something with "$1" ${2+"$2"} ${3+"$3"}... ${10+"${10}"}
[ "$#" -gt 10 ] || break
shift 10
done
xargs
프로세스 대체를 지원하는 GNU 및 쉘을 사용하십시오.
xargs -n10 -r0a <(printf '%s\0' *.txt) something with
그리고 zsh
:
files=(*.txt(N))
while (($#files)) {
something with $files[1,10]
files[1,10]=()
}
또는:
autoload -U zargs
xargs -l10 -- *.txt -- something with
zsh
또한 glob에서 범위를 사용할 수 있습니다.
something with *.txt([1,10])