스크립트는 디렉터리에 따라 다르게 동작합니다.

스크립트는 디렉터리에 따라 다르게 동작합니다.

이름에 이상한 문자가 포함된 파일의 이름을 바꾸도록 특별히 설계된 더 큰 스크립트에서 추출된 간단한 스크립트가 있습니다. 한 디렉토리에서 성공적으로 실행된다고 말했듯이 동일한 컴퓨터의 다른 디렉토리에서 성공적으로 실행했지만 어떤 이유로 더 높은 수준의 디렉토리에 대해 실행할 때 파일 이름 바꾸기 오류가 발생합니다. 예를 들어 UnsortedMusic이라는 폴더에 대해 이 명령을 실행했습니다. 해야 할 일은 다음과 같습니다.

/UnsortedMusic/Dir 001/SubDir 001/Song To Sing.flac > /UnsortedMusic/Dir 001/SubDir 001/SongToSing.flac

이름에서 공백을 제거한 다음 기본적으로 동일한 코드를 사용하지만 특히 디렉터리에 대해 디렉터리 이름에서 공백을 제거합니다.

/UnsortedMusic/Dir 001/SubDir 001/SongToSing.flac > /UnsortedMusic/Dir001/SubDir001/SongToSing.flac

이것은 다른 디렉토리에서는 성공적으로 작동하지만 어떤 이유로 특정 디렉토리에서는 다음과 같은 작업을 수행합니다.

 /UnsortedMusic/Dir 001/SubDir 001/Song To Sing.flac > /UnsortedMusic/Dir001/SubDir001/UnsortedMusicDir001SubDir001SongToSingflacSongToSingflac

보시다시피 모든 디렉터리 이름으로 파일 이름을 바꿀 뿐만 아니라 "."도 제거합니다. .flac에서 이는 수천 개의 파일을 수동으로 변경해야 함을 의미합니다.

이 코드는 다음과 같습니다.

#!/bin/bash
#set -e

FolderName="Unsorted" #Dir location to be sorted

# Log Location on Server.
LOG_LOCATION=$(pwd) #/home/user/scripts/logs
exec > >(tee -i $LOG_LOCATION/RenameFile.log)
exec 2>&1
Start by seeing if the new directory allready exists, if not, make it

echo "Looking in $FolderName for files with abnormal characters"
#Rename any directories that might have a weird name structure that could conflict
find ${FolderName} -type f \( -name "* *" -o -name "*(*" -o -name "*[*" -o -name "*&*" \) -print0 | sort -rz | while read -d $'\0' file;
    do
        mv -v "$file" "$(dirname "$file")/$(basename "${file//[^a-zA-z0-9_-.]/}")";
done

#echo "Log Location should be: [ $LOG_LOCATION ]"
echo "Finished Process"

이는 다음과 같은 더 큰 프로세스 스크립트의 일부입니다.

#!/bin/bash
#set -e

NewDirName="TestDirV2" #New Dir name
FolderName="TestDir" #Dir location to be sorted

# Log Location on Server.
LOG_LOCATION=$(pwd) #/home/user/scripts/logs
exec > >(tee -i $LOG_LOCATION/Organizer.log)
exec 2>&1
#Start by seeing if the new directory allready exists, if not, make it
if [ ! -d ${NewDirName} ];
then 
    mkdir -p ${NewDirName}
    chmod -R a+rwx ${NewDirName}
fi

echo "Looking in $FolderName for files with abnormal characters"
#Rename any files that might have a weird name structure that could conflict 
find ${FolderName} -type f \( -name "* *" -o -name "*(*" -o -name "*[*" -o -name "*&*" \) -print0 | sort -rz | while read -d $'\0' file;
    do
        mv -v "$file" "$(dirname "$file")/$(basename "${file//[^a-zA-z0-9_-.]/}")";
done

echo "Looking in $FolderName for directories with abnormal characters"
#Rename any directories that might have a weird name structure that could conflict 
find ${FolderName} -type d \( -name "* *" -o -name "*(*" -o -name "*[*" -o -name "*&*" \) -print0 | sort -rz | while read -d $'\0' file;
    do
        mv -v "$file" "$(dirname "$file")/$(basename "${file//[^a-zA-z0-9_-.]/}")";
done


for FileType in $(find $FolderName -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u)
do


    echo "Finished removing odd characters that may result in problems"

    NewDir=$(echo "${NewDirName}/${FileType}");      

    if [ ! -d ${NewDirName}/${FileType} ];
        then
            echo "$NewDir does not exist"      
            echo "Making $NewDir"
            mkdir -p ${NewDir}
            chmod -R a+rwx ${NewDir}
    fi

    echo "Now looking for renamed $FileType files"
    for FileToMove in $(find ${FolderName} -name "*.${FileType}");
    do  
        echo "Dir to move ${FileToMove}"        
        echo "File to move ${FileToMove##*/}"

        SpecificFile=$(echo "${FileToMove##*/}");       

        echo "Checking to see if $SpecificFile already exist in $NewDir"

        if [ -f ${NewDir}/${SpecificFile} ];
        then    
            x=0
            while [ -f ${NewDir}/${SpecificFile} ]        
                do
                echo "File ${SpecificFile} already exists, renaming"
                SpecificFile=${x}${SpecificFile}
                x=$(( x++ ));
                echo "Renamed to $SpecificFile"
            done
        fi    

    #rsync -rav --progress ${FileToMove} ${NewDir}/${SpecificFile}
    mv -v ${FileToMove} ${NewDir}/${SpecificFile}
    done

done
chmod -R a+rwx ${NewDir}

echo "Log Location should be: [ $LOG_LOCATION ]"
echo "Finished Process"

관련 정보