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