
내 작업의 문제점은 해당 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
입력 파일당 하나의 명령을 실행하려고 합니다. , , , ( 및 와 같은 루프(쉘이 재귀 와일드카드를 지원하는 경우)를 사용하여 이 작업을 수행
할 수 있지만 루프 구문은 다릅니다.for
zsh
ksh93
yash
bash
tcsh
fish
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' {} \;
이제 누군가는 이것을 "최적화"하고 find
s를 또는 -ism -exec
과 함께 사용하지 않는 이유가 궁금할 것입니다 . 예를 들면 다음과 같습니다.+
zsh
sed 'cmd' **/file.txt(.)
물론 sed
여러 개를 호출하므로 더 효율적입니다.문서피연산자 그러나저것문제일 가능성이 높습니다. 단순화를 위해 명령 1을 사용하여 각 파일의 첫 번째 줄만 인쇄한다고 가정해 보겠습니다(파일 2를 내부에서 편집하지 않고 결합
된 출력 을 다른 파일로 리디렉션하거나 확인만 할 수도 있음). 달리다sed
1q
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
)에는 도움이 되지 않습니다.
1q
1: 시도하는 것이 마음에 들지 않으면 $d
각 파일의 마지막 줄을 삭제해야 합니다. 2: 때로는 제안한 대로 처리 할 수도 있지만 명령 중 하나가 다음과 같은 경우에는 확실히 그렇지 않습니다. 3: 다음과 같은 이유 때문이라고 주장할 수 있습니다. 종료 - 하지만 다음을 사용하면 동일한 일이 발생합니다 . 2를 강조하고 있습니다 .
gnu sed
-i
-s
sed
q
q
sed -n '1p'
q
답변3
파일 경로에 공백, 줄 바꿈, 작은따옴표, 큰따옴표 또는 백슬래시 문자가 포함되어 있지 않다고 가정합니다.
find . -name 'file.txt' -type f | xargs sed command