grep 및 for를 사용하여 파일 이름 바꾸기

grep 및 for를 사용하여 파일 이름 바꾸기

.txt, .data, .conf 확장자를 사용하여 파일 이름을 ".xml"로 바꾸고 싶습니다.

hello.txt -> hello.xml

그렇게 하려면 파일에 다음 줄도 포함되어야 합니다.<?xml version="1.0" encoding="UTF-8"?>

이것이 내가 가진 것입니다:

for file in *
do
if [ $(grep -Rc '<?xml version="1.0" encoding="UTF-8"?>' --include ".txt" --include ".data" --include "*.conf") = true ]
then
rename extension to: .xml
fi
done

어떤 아이디어가 있나요?

답변1

만약 너라면필요grep그걸로 하고 for아마도 이와 같은 것을 할 수 있을까요?

grep -RlZ '<?xml version="1.0" encoding="UTF-8"?>' --include "*.txt" --include "*.data" --include "*.conf" | 
  xargs -0 sh -c 'for f; do echo mv -- "$f" "${f%.*}.xml"; done' sh

( echo올바른 일을 하고 있다고 만족하면 제거하세요).

  • grep -RlZ일치하는 파일 이름이 null로 구분된 목록을 출력합니다.

  • xargs -0null로 구분된 목록을 다음으로 전달합니다.sh -c

  • for f파일 이름을 위치 매개변수로 반복합니다.

while또는 ( 대신 사용이 허용되는 경우 ) 및 다음과 같은 추가 쉘 스크립틀릿을 for건너뛸 수 있습니다 .xargs

grep -RlZ '<?xml version="1.0" encoding="UTF-8"?>' --include "*.txt" --include "*.data" --include "*.conf" | 
  while IFS= read -r -d '' f; do echo mv -- "$f" "${f%.*}.xml"; done

답변2

find . -type f \( -name "*.txt" -o -name "*.data" -o -name "*.conf" \) -exec sh -c '
    for file in "$@"; do
        if grep -qF "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "$file"; then
            mv -- "$file" "${file%.*}.xml"
        fi
    done
' findshell {} +

find이런 맥락에서는 더 적절하다고 생각합니다 . .txt, .data확장자 를 가진 일반 파일을 재귀적으로 찾아 .conf제공한 문자열이 각 파일에 있는지 확인합니다. 그렇다면 확장명을 명령 .xml으로 변경합니다 mv.

코드가 예상대로 작동하는지 확실하지 않은 경우 echobefore 를 추가하여 mv코드가 어떻게 작동하는지 확인할 수 있습니다.

또한 해당 스크립트는 POSIX가 아닌 유틸리티에 의존하지 않는다는 점도 언급해야 합니다.

답변3

다음을 시도해 볼 수 있습니다.

for file in *.{txt,conf}; do 
  [[ $(grep "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "$file") ]] && \
  mv "$file" "${file%.*}.xml" || echo "$file" " does not match"
done

답변4

사용 bash:

shopt -s globstar dotglob nullglob extglob

string='<?xml version="1.0" encoding="UTF-8"?>'

for pathname in ./**/*.@(txt|data|conf); do
    if [[ -f $pathname ]] && grep -q -F "$string" "$pathname"; then
        mv -i "$pathname" "${pathname%.*}.xml"
    fi
done

일반적으로 기본적으로 설정되지 않는 여러 셸 옵션을 설정하는 것부터 시작합니다 bash.

  • globstar하위 디렉터리와 재귀적으로 일치하는 globbing 패턴을 활성화합니다 **.
  • dotglobGlobbing 패턴을 숨겨진 이름과 일치시킵니다.
  • nullglob일치하지 않는 패턴을 확장되지 않은 상태로 유지하는 대신 완전히 사라지게 만듭니다. 이렇게 하면 일치하는 항목이 없으면 나중에 루프가 전혀 실행되지 않습니다.
  • extglob예를 들어 @(txt|data|conf)괄호 안의 문자열 중 하나와 일치하는 확장된 글로빙 패턴을 활성화합니다.

그런 다음 후보 이름을 반복하고 주어진 문자열에 대해 각각을 테스트합니다. 문자열이 발견되면 마지막 점 문자 뒤의 파일 이름 접미사를 xml.

관련 정보