특수 문자를 제거하고 파일과 디렉토리의 _로 공백을 바꿉니다. 배시에서는 재귀 적으로 사용합니다.


1

나는 약간의 문제를 안고있는 스크립트를 가지고있다. 재귀 적으로 다시해야하지만 약간의 문제가 있음을 알고있다. 스크립트는 $ -,) (!와 같은 특수 문자를 제거하고 ""을 "_"로 대체하여 주어진 폴더의 모든 파일과 폴더의 이름을 바꾸어야합니다.

다시해야 할 부분은 다음과 같습니다.

# Rename directories
find "$ORIG_DIR" -name "*" -type d| while read dname
do
    NEW_DIR=`echo "$dname" |sed -E 's/^[ \t]*//g; s/[ \t]*$//g; s/\./_/g; s/\,/_/g; s/ /_/g'`

        # Rename files
        find "$ORIG_DIR" -name "*" -type f | while read fname
        do
            NEW_FNAME=`echo "$fname" |sed -E 's/^[ \t]*//g; s/[ \t]*$//g; s/\./_/g; s/(.*)_/\1\./; s/\,/_/g; s/ /_/g'`
            if [ -e $NEW_FNAME ]
            then
                echo "$NEW_FNAME already exists. Not replacing $fname"
            else
                echo "Replacing $fname with $NEW_FNAME"
                mv "$fname" $NEW_FNAME
            fi
        done

    if [ -e $NEW_DIR ]
    then
        echo "$NEW_DIR already exists. Not replacing $dname"
    else
        echo "Replacing $dname with $NEW_DIR"
        mv "$dname" $NEW_DIR
    fi
done

END

이 스크립트로 어디에 문제가 있습니까? 오류 메시지가 표시됩니까? 예상과 다른 결과가 있습니까?
nohillside

내가 결국 얻는 오류 메시지는 그러한 파일이나 디렉토리가 없다는 것입니다. 이 스크립트는 또한 제거하지 않습니다!, $ -) (
Erick

글쎄, 스크립트의 한가지 문제점은 find 명령은 항상 전체 디렉토리 트리를 탐색합니다 (무슨 일이 일어나는지 echo 명령문으로 내부 기능을 대체합니다).
nohillside

답변:


1

테스트되지 않은

find . -depth -print0 |
while IFS= read -d '' -r file; do
    dir=$(dirname "$file")
    base=$(basename "$file") 
    base=${base//[[:space:]]/_}         # change whitespace to underscores
    base=${base//[^[:alnum:]_.]/}       # delete any chars not alphanumeric _ .
    newname="$dir/$base"
    if [[ -e $newname ]]; then
        echo "'$newname' exists, not renaming '$file'"
    else
        echo mv "$file" "$newname"
    fi
done

정상적으로 보일 경우 "echo"

여기서 중요한 것은 찾을 수있는 "-depth"옵션입니다. "./sub dir / file name"을 내 보냅니다. 전에 "./sub dir". 그렇지 않으면 "./sub dir"이 "./subdir"로 이름이 바뀌면 while 루프가 "./sub dir / file name"에 도달 할 때 '파일을 찾을 수 없음'오류가 발생합니다. 또한, 디렉토리에 대해 다른 논리가 필요하지 않음을 의미합니다.

찾아야 할 "-print0"옵션과 읽기 명령 주위에 바쁜 것은 파일 이름이 공백으로 올바르게 처리되도록하는 것입니다.


이것은 좋은 단계이지만 지나치게 빠릅니다. "."이 제거됩니다. 파일 확장명 앞에는 좋지 않습니다. 또한 밑줄을 붙이고 공백을 밑줄로 대체하려고합니다. 둘째, 명령에서 폴더 A의 이름을 지정했지만 폴더 A를 포함하는 디렉토리의 모든 폴더에 스크립트가 충돌합니다.
Erick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.