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일치하는 항목이 발견된 파일 이름의 빈 구분 목록을 출력합니다.

  • xargs -0이 비어 있고 구분된 목록을 다음에 전달하십시오.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확장명이 via command 로 변경됩니다 mv.

코드가 예상대로 작동하는지 확실하지 않은 경우 echo코드를 앞에 추가하여 코드가 수행 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반복적으로 일치하는 하위 디렉터리에 대해 와일드카드 모드를 활성화합니다 **.
  • dotglob와일드카드 패턴을 숨겨진 이름과 일치시킵니다.
  • nullglob확장되지 않은 채로 남아 있는 대신 일치하지 않는 패턴을 완전히 사라지게 만듭니다. 이렇게 하면 일치하는 항목이 없으면 나중에 루프가 실행되지 않습니다.
  • extglob@(txt|data|conf)괄호로 묶인 문자열 중 하나와 일치하는 등 확장된 와일드카드 패턴을 활성화합니다 .

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

관련 정보