"file.txt"라는 이름의 모든 파일을 반복적으로 찾아 sed 명령을 실행합니다.

"file.txt"라는 이름의 모든 파일을 반복적으로 찾아 sed 명령을 실행합니다.

내 작업의 문제점은 해당 file.txt작업이 하위 폴더나 하위 폴더에 위치할 수 있다는 것입니다. 일반적인 구조는 다음과 같습니다.

   folder
     |___subfolder
             |_____file.txt
     |
     |___subfolder
             |____subfolder
                      |_______file.txt
     etc

이전 코드는 하위 하위 폴더를 처리하지 않으며 이 부분을 추가하는 방법을 모릅니다(일부 하위 폴더에는 후속 폴더가 없기 때문).

 for dir in ./*/ ; do
        if [ -d "$dir" ]; then 
           cd $d;
           for subdir in ./*/; do
               cd $subdir && $(sed command file.txt) && cd ..;
           done
           cd ..
        fi
done

또한 다음과 같은 것을 사용하는 한 줄 방법이 있다는 것도 배웠습니다 find.

find . -name 'file.txt' | sed command file.txt

find분명히 이것은 내 디렉토리에만 디렉토리를 반환하므로 작동하지 않습니다 .file.txt

답변1

노력하다:

find . -name 'file.txt' -exec sed command {} +

file.txt그러면 하위 디렉터리에서 해당 파일이라는 이름의 모든 파일을 찾아 .해당 파일에 대해 실행합니다.sed command

sed해당 파일을 수정 하려면 이 -i옵션을 추가하세요.

-exec ... +지금은 꼭 필요 하지만POSIXfind(힌트: jordanm), 일부 사람들은 unsupported 를 사용하고 있을 수 있습니다 +. 다음 중 하나가 있는 경우 다음을 사용하세요(팁: unxnut).

find . -name 'file.txt' -exec sed command {} \;

더 안전한 선택

디렉터리 구조를 빠르게 변경하면 -exec경쟁 조건이 발생할 수 있습니다. 보안을 강화하려면 다음을 사용하세요 -execdir(해당 팁: unxnut).

find . -name 'file.txt' -execdir sed command {} +

디렉토리에 현재 디렉토리가 있으면 실행 PATH-execdir거부됩니다.

답변2

sed명령이 수행하는 작업을 모르는 경우 sed입력 파일당 하나의 명령을 실행하려고 합니다. , , , ( 및 와 같은 루프(쉘이 재귀 와일드카드를 지원하는 경우)를 사용하여 이 작업을 수행
할 수 있지만 루프 구문은 다릅니다.forzshksh93yashbashtcshfish

shopt -s globstar        # bash
#set -o globstar         # ksh93
#set -o extended-glob    # yash

for f in **/file.txt; do [ -f "$f" ] && sed 'cmd' "$f"; done

또는 (다른 사람들이 지적했듯이) find:

find . -type f -name 'file.txt' -exec sed 'cmd' {} \;

이제 누군가는 이것을 "최적화"하고 finds를 또는 -ism -exec과 함께 사용하지 않는 이유가 궁금할 것입니다 . 예를 들면 다음과 같습니다.+zsh

sed 'cmd' **/file.txt(.)

물론 sed여러 개를 호출하므로 더 효율적입니다.문서피연산자 그러나저것문제일 가능성이 높습니다. 단순화를 위해 명령 1을 사용하여 각 파일의 첫 번째 줄만 인쇄한다고 가정해 보겠습니다(파일 2를 내부에서 편집하지 않고 결합
출력 을 다른 파일로 리디렉션하거나 확인만 할 수도 있음). 달리다sed1q

find . -name 'file.txt' -exec sed '1q' {} +

또는

sed '1q' **/file.txt(.)

그러나 그들 중 누구도 배달할 수 없을 것입니다.
파일 피연산자가 여러 개 지정된 경우 지정된 파일을 지정된 순서대로 읽고 연결을 편집해야 합니다.
따라서 sed각 파일의 첫 번째 줄이 아닌 입력의 첫 번째 줄만 인쇄됩니다 3 .
이제 스위치 gnu sed가 있습니다 -s.

-s, --separate
        consider files as separate rather than as a single continuous long stream

때로는 이것이 도움이 될 수도 있지만, 이 특별한 경우( 1q)에는 도움이 되지 않습니다.


1q1: 시도하는 것이 마음에 들지 않으면 $d각 파일의 마지막 줄을 삭제해야 합니다. 2: 때로는 제안한 대로 처리 할 수도 있지만 명령 중 하나가 다음과 같은 경우에는 확실히 그렇지 않습니다. 3: 다음과 같은 이유 때문이라고 주장할 수 있습니다. 종료 - 하지만 다음을 사용하면 동일한 일이 발생합니다 . 2를 강조하고 있습니다 .
gnu sed-i-ssedq
qsed -n '1p'q

답변3

파일 경로에 공백, 줄 바꿈, 작은따옴표, 큰따옴표 또는 백슬래시 문자가 포함되어 있지 않다고 가정합니다.

find . -name 'file.txt' -type f | xargs sed command

관련 정보