특정 문자 수를 포함하는 모든 파일 이름 가져오기

특정 문자 수를 포함하는 모든 파일 이름 가져오기

모든 파일 이름을 정확히 16자(숫자 및 소문자)로 변경하고 싶습니다. [0-9a-z]{16}다음 코드 조각에서 [0-9a-z]\{16\}자리 표시자를 시도했지만 regX작동하지 않습니다.

for file in <regX>
do
  mv "$file" "${file}.txt"
done

답변1

쉘 와일드카드 모드정규 표현식이 아닙니다.. 비슷해 보일 수도 있지만 어떤 면에서는 매우 다르게 작동합니다.

정규식은 [0-9a-z]{16}위의 문자 범위를 포함하는 16자 문자열과 일치합니다(포함된 문자열은 더 길 수 있음).

동등한 쉘 와일드카드 패턴은 다음과 유사합니다.

*[0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z]*

이 때문입니다

  1. 와일드카드 모드는 "처음 N번 반복" 수정자를 지원하지 않습니다.
  2. 기본적으로 와일드카드 패턴은 시작과 끝 부분에 고정되어 있습니다. 그래서 *패턴의 시작과 끝 부분에 삽입합니다. A는 *임의 개수의 모든 문자와 일치합니다. 일치 항목을 원하면 다음을 제거하세요.정확히16자.

Perl을 사용하여 16비트 문자열을 만들 수 있습니다 [0-9a-z].

$ pattern="$( perl -e 'print "[0-9a-z]" x 16' )"

를 사용하면 bash선택적으로 현재 디렉터리의 모든 이름을 반복한 다음 이름이 정규식과 일치하는지 테스트할 수 있습니다.

for name in *; do
    if [[ -f "$name" ]] && [[ "$name" =~ ^[0-9a-z]{16}$ ]]; then
        echo mv "$name" "$name.txt"
    fi
done

echo그것이 올바른 일을 하고 있다는 것을 알게 되면, 그것을 제거하십시오.

더 긴 이름이 일치하지 않도록 패턴을 고정했습니다. 또한 -f우리가 얻은 이름이 실제로 일반 파일의 이름인지 확인하기 위해 테스트했습니다 .

답변2

그리고외부 전역 변수

shopt -s extglob
for file in +([0-9a-z])
do
    [[ ${#file} == 16 ]] && echo mv "$file" "${file}.txt"
done
  • +([0-9a-z])하나 이상의 [0-9a-z]문자를 나타냅니다.
  • ${#file}파일 이름의 길이를 제공합니다
  • echo테스트 실행에 사용하고 모든 것이 잘 작동하면 제거하십시오.

답변3

renamePerl-rename( Debian 기반 시스템 또는 기타 시스템에서 호출됨) 이 있는 경우 perl-rename다음을 수행할 수 있습니다.

perl-rename -n 's/^[0-9a-z]{16}$/$&.txt/' *

요구 사항에 맞는 경우 이를 제거 -n하여 실제로 파일 이름을 바꾸십시오. 구문 perl-rename은 perl 명령입니다. 여기서는 대체 연산자( s/from/to/)를 사용하여 from를 대체합니다 to. 이 경우 from정규 표현식은 "일치하는 항목"을 나타내는 to특수 변수 $&와 확장자 입니다 .txt.


Shell glob을 사용하여 이 작업을 수행하려면(사용@쿠살라난다또는@선딥메서드는 완료를 위한 것입니다):

for f in [0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z]; do
    mv -- "$f" "$f".txt
done

GNU 사용 find:

find . -regextype posix-extended -regex '.*/[0-9a-z]{16}' -exec mv {} {}".txt" \;

답변4

L16=$(csh -c 'repeat 16 echo -n "?"')
find . -name "$L16" ! -name '*[!0-9a-z]*' -exec sh -c '
   mv "$1" "$1.txt"
' {} {} \;

관련 정보