.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
.