모든 하위 디렉터리/파일에 명령 적용

모든 하위 디렉터리/파일에 명령 적용

상위 디렉터리에는 공백으로 구분된 하나 이상의 텍스트 파일이 포함된 여러 하위 디렉터리가 있습니다.

내가 원하는 것을 출력하지만 단일 파일에만 출력하는 다음 명령이 있습니다.INPUTFILE.txt

awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' INPUTFILE.txt

수천 개의 하위 디렉터리가 있고 파일 이름이 다양하다는 점을 고려하면 이 명령을 상위 디렉터리의 모든 하위 디렉터리에 어떻게 적용할 수 있습니까?

답변1

먼저 cd원하는 상위 디렉터리로 이동합니다.

그런 다음 다음을 사용하여 명령을 find실행합니다 awk.

find -type f -exec awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' {} +

설명하다

  • 기본적으로 이미 재귀적이므로 모든 하위 디렉터리에 대해 이 작업을 수행합니다.
  • -type ff파일 및 디렉터리가 아닌 파일 로 검색을 제한합니다.
  • -exec somecommand {} +구문은 명령을 실행하고 찾은 파일 경로를 사용자가 작성한 위치에 배치합니다.{}
  • 이 옵션은 조회 결과를 매개변수로 저장하면서 +하나의 인스턴스만 실행하므로 더 효율적이라고 합니다 . 반면에 이를 실행하는 다른 방법(여기에 표시되지 않음)은 각 파일 이름에 대해 awk를 한 번 실행하고 덜 효율적이라고 합니다.awk{}

답변2

좋고 빠르며 더러운 방법은 루프를 사용하는 것이지만 먼저 뭔가를 설정해야 합니다. 다음은 awk 명령을 실행하려는 파일의 이름과 경로가 포함된 텍스트 파일을 제공합니다. 상위 디렉터리에서 실행해야 합니다.

find . -type f -print >> source.txt

그런 다음 루프를 실행합니다.

for i in $(cat source.txt); do 
  awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' $i >> OUTPUTFILE.txt
done

단일 출력 파일이 필요한지, 아니면 여러 개의 출력 파일이 필요한지는 확실하지 않습니다.

여러 개의 출력 파일을 원할 경우 다음을 수행할 수 있습니다.

for i in $(cat source.txt); do 
  awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' $i >> $i.processed.txt
done

답변3

고쳐 쓰다: 답변을 작성한 후 질문이 바뀌었습니다..

for a in */INPUTFILE.txt
do 
   cp "$a" "$a.bak" 
   YOUR-AWK "$a.bak" > "$a" 
done

새로운 질문이 이상해 보이네요! 내가 올바르게 이해했다면

YOUR-AWK */*.txt > output.txt

관련 정보