파일을 반복하고('for file in...) 하위 디렉터리도 포함하시겠습니까?

파일을 반복하고('for file in...) 하위 디렉터리도 포함하시겠습니까?

저는 파일을 많이 변경하기 위해 sed를 사용하고 있습니다. 이 질문은 패턴과 일치하는 파일을 반복하고 원래 파일 검색 재귀 및 파일 생성 출력에 하위 디렉터리를 포함하려는 모든 작업과 관련이 있다고 생각합니다(즉, 구조를 복사하기 위해 생성).

제가 처음 받은 파일은

mkdir -p _seded
for file in *_spec.rb
do
  cat $file
  ... a bunch of seds
  > _seded $file
end

플러스 파일은 어떻게 구할 수 있나요?하위 디렉토리파일 일치 패턴?

예를 들어, 내가 가지고 있는 경우

spec/ex1
spec/ex2_spec.rb
spec/subs/subex1
spec/subs/subex1_spec.rb
spec/subs/subex2/aaa
spec/subs/subex3/s3_spec.rb
spec/subs/subex4/s4.rb
spec/subs/subex4/bbb

그러면 나는 다음을 얻어야 합니다:

_seded/ex2_spec.rb
_seded/subs/subex1_spec.rb
_seded/subs/subex3/s3_spec.rb

참고: subex2 및 subex4 디렉토리는아니요비어 있기 때문에 생성됩니다.

나는 시도했다:

mkdir -p _seded
find . -name '*_spec.rb' | xargs cat |
  sed -e '[/pattern/replace code]' > _seded/$file

하지만 다음과 같은 오류가 발생합니다.

$ ./convert_should_to_expect.sh 
./convert_should_to_expect.sh: line 5: _seded/: Is a directory
xargs: cat: terminated by signal 13
now doing its !!!
sed: couldn't edit _seded/: not a regular file
awk: cmd. line:1: fatal: cannot open file `_seded/' for reading (Is a directory)
mv: `_seded/tmp' and `_seded/tmp' are the same file
sed: couldn't edit _seded/: not a regular file
sed: couldn't edit _seded/: not a regular file

답변1

다음을 수행할 수 있습니다.

cd spec
find . -type f -name '*_spec.rb' | while read file; do
    mkdir -p ../_seded/"${file%/*}"
    cat "$file" | sed ... > ../_seded/"$file"
done

${file%/*}$file출력 디렉토리를 생성하는 데 사용할 수 있도록 파일 이름 부분을 잘라냅니다.mkdir command

답변2

테스트되지 않은 코드입니다! 여기서의 아이디어는 여러분이 따라야 한다고 생각하는 논리를 여러분에게 제공하는 것입니다. 여기에는 하위 디렉터리가 포함되지 않지만 적어도 예제 코드처럼 빈 파일을 많이 생성하지 않으며 일부 구문 수정이 있습니다.

grep 또는 find 문과 같은 것을 사용하여 하위 디렉터리를 포함하도록 for 루프를 개선할 수 있지만 이를 파악하는 데 시간이 좀 걸렸습니다. 누군가 자신의 머리 위로 무슨 일이 일어나고 있는지 아는 사람이 있을까요?

mkdir -p _seded
TMPFILE=/var/tmp/sedtmp$$$    # Someone can help me with the syntax for a unique file here. 
for file in *_spec.rb
do
  cat $file
  ... a bunch of seds >> $TMPFILE    # Each with this addition after it.
  COUNT=`wc -l $TMPFILE`
  if [ COUNT -gt 0 ]
  then                   
     cp $TMPFILE _seded/$file   
  fi
  > $TMPFILE
done
rm $TMPFILE

관련 정보