for 루프에서 대상 리디렉션 파일이 처리되지 않도록 제외

for 루프에서 대상 리디렉션 파일이 처리되지 않도록 제외

이로 인해 용량이 LIST매우 커집니다(단시간에 몇 GB까지 커지는 경우 등).

$ for i in *; do echo $i; cut -d '   ' -f1 $i ; done > LIST

예를 들어 10초 후:

$ wc -l LIST
132654955 LIST
$ ls -hl LIST
-rw-r--r-- 1 user users 2.3G Jan 22 21:35 LIST

LIST그 이유는 처리해야 할 파일 목록에 추가되어 처리가 완료되지 않기 때문인 것 같습니다 cut. 이 문제에 대한 3가지 해결책을 찾았습니다.

  • LIST처리에서 제외:

    for i in !(LIST); do echo $i; cut -d '     ' -f1 $i ; done > LIST
    
  • 다른 디렉토리를 사용하십시오 LIST:

    for i in *; do echo $i; cut -d '     ' -f1 $i ; done > /tmp/LIST
    
  • *루프를 실행하기 전에 무엇이든 확장 C-x *하거나 표시합니다.$ bind -p | grep glob-expand-word

내 추론이 맞나요? 어떤 방법이 가장 좋나요?

답변1

당신의 추론이 정확합니다.

귀하가 제안한 솔루션 중에서 저는 처음 두 가지, 특히 두 번째 솔루션을 선호합니다. 왜냐하면 다른 디렉토리에 있는 파일에 쓰는 것이 더 깔끔해 보이기 때문입니다.

변수를 사용하는 또 다른 옵션은 다음과 같습니다 GLOBIGNORE(쉘이 이를 지원한다고 가정).

GLOBIGNORE=LIST  ## "LIST" file will be ignored while globbing
for i in *; do echo "$i"; cut -d '   ' -f1 "$i"; done >LIST

답변2

폴더의 모든 파일에 대해 활동을 수행하고 출력 파일을 동일한 폴더에 넣는 것은 현명한 접근 방식이 아니라고 생각합니다. 내 >출력 리디렉션은 /tmp출력을 위한 공간이 충분하지 않다는 것을 알지 않는 한 항상 으로 끝납니다. 그런 다음 더 적합한 파일 시스템을 찾습니다. 하지만 입력 파일을 처리하는 디렉터리에 절대 넣지 마세요.

관련 정보