사람들이 더 많은 것을 알고 싶어하기 때문에 편집되었으며 mv가 파일이 대상 영역에 있는 것을 허용하지 않을 때 다른 위치에서 동일한 이름을 가진 두 개의 디렉토리를 처리하고 한 디렉토리를 다른 디렉토리로 이동하는 방법을 알고 싶었습니다.
그들은 내가 무엇을 하려는지, 왜 하는지 알고 싶어 합니다...
내 스크립트는 상위 디렉터리의 모든 디렉터리를 가져온 다음 mp3 또는 flac 파일이 포함된 각 디렉터리를 한 번에 하나씩 반복한 다음 비트 전송률 확인을 통해 리샘플링을 수행해야 하는지 확인하고 비트 전송률이 더 큰 경우 리샘플링을 설정합니다. 비트 전송률 파일을 다시 샘플링하고, 그렇지 않은 경우 건너뜁니다. 다음 단계: 태그 정보로 모든 파일의 이름을 바꿉니다. 파일 자체에 태그 정보가 없으면 파일이 있는 디렉터리에서 꺼내 아티스트 디렉터리에 추가합니다. 앨범 디렉토리 등이 필요하지만 필요한 경우 태그 정보가 파일에 추가된 다음 해당 META 태그 정보를 사용하여 파일 이름을 바꿉니다.
노래-아티스트.mp3
이 스크립트를 사용하면 스크립트가 아티스트 디렉터리의 모든 파일 처리를 마친 후 파일을 orgia 디렉터리에 보관한 다음 스크립트를 다시 실행할 때 반환되지 않도록 파일을 partent 디렉터리 밖으로 이동해야 합니다. 방금 완료된 모든 파일 문서......
그래서 아티스트/앨범/레코드 @320MP3 쓰레기 중 일부가 디렉토리 이름에 기록되었기 때문에 아티스트 디렉토리의 이름을 아티스트 이름으로 바꾸도록 했습니다. 그래서 정리하고 META TAG Artsit info에서 아티스트로 이름을 바꿨습니다. 그런 다음 해당 디렉토리 시스템에서 수행된 모든 작업을 보존하면서 이를 다른 상위 디렉토리로 이동합니다.
동일한 아티스트에 대해 다양한 앨범 디렉터리 이름이 있고 상위 디렉터리의 다른 디렉터리에 있는 파일이 모두 중복되기 때문입니다. 이름이 다른 디렉터리를 가진 동일한 아티스트 - 예 -
1 앨리스 쿠퍼 매드맨/앨범명/이전 파일
완료되면 됩니다
앨리스 쿠퍼/앨범 이름/새 파일
2 Alice Cooper 여기에 있는 다른 것/앨범/CD1/Old-iles
앨리스 쿠퍼(Alice Cooper) 다른 것이 무엇이든 여기에 있습니다/albums/cd2/old-files
완료되면 됩니다
앨리스 쿠퍼/앨범/CD1/New-iles
앨리스 쿠퍼/앨범/CD2/새 파일
단계:
첫 번째 루프는 처리할 디렉터리 이름을 가져오는 것입니다.
두 번째 루프는 해당 디렉터리 구조의 각 파일을 검토하고 다시 매핑하고, 필요한 경우 레이블을 다시 지정하고, 파일 이름을 바꾸고, 모든 파일이 완료되면 디렉터리 이름을 아티스트 이름으로 바꾼 다음 해당 상위 디렉터리에서 다른 상위 디렉터리로 이동하는 것입니다. 그것을 얻는 데 방해가 되지 않습니다.
이 상위 디렉터리 내의 다음 디렉터리에 대해 단계를 반복합니다.
이 오류는 이름이 변경되어 다른 상위 디렉터리로 이동된 앨범 이름과 일치하는 항목을 루프에서 발견할 때 발생합니다.
mv -f /from/here/sameNameDir /to/here/ - that has the same name dir in it already
디렉토리가 이동되지 않으면 스크립트는 완료된 모든 파일을 반복하며 파일이 40,000개가 넘으므로 이 작업을 수행하는 데 시간이 걸리므로 두 번째 실행을 위해 전체 디렉토리를 거기 밖으로 이동하겠습니다. 스크립트 새로운 것을 시작하는 데 사용할 수 있습니다
내 스크립트는 작동하지만 일부 버그가 있어서 여전히 테스트 모드이므로 에코가 많이 발생합니다. 그리고 제가 작성한 코드를 재사용하여 거기에서도 영화 리뷰를 볼 수 있습니다.
#!/bin/bash
# started writting this on 11-24-2015
typeset -i FilesCountInSecondLoop FilesInDirCount filesLeftToDo DirCountDn
let FilesCountInSecondLoop=0 FilesInDirCount=0 filesLeftToDo=0 DirCountDn=0
typeset -i cycleThroughFilesCount
let cycleThroughFilesCount=0
working_dir="/media/data/test-run"
move_to="/media/data/move_to_test"
# where you keep this script to run it in a terminal
# it is written so that you do not have to put it in the
# working directory or directories to eliminate having to put
# a separate script in every folder to run it
##############################################
script_dir="$HOME/working"
# max rate you want your orgianl files to be check for to be
# resampled at
LameCheckRate=192
# bitrate you want your FLAC files coverted to mp3 in
# you can convert your FLAC to a higher rate then the
# resmapled mp3 if you like
##################################
flac_convert_brate=192
# this is the FLAC settings it runs at
# flac -cd "$FILENAME" | lame -b "${flac_convert_brate}" - "$newFile"
# LAME settings VBR low and High end
LameLowEnd=128
LameHighEnd=192
# this is the LAME settings it runs at
##lame -V2 -b"${LameLowEnd}" -B"${LameHighEnd}" -F --vbr-new -m j -q2
#####################
## DO NOT CHANGE ####
runTime=1 ###########
convertN=$1 #########
#####################
# gets amount of files wanted to resample on run
# from command line args
function rst(){
if [[ convertN -lt runTime ]]; then
echo " you forgot to enter an amount to resample"
ConvertNum=0
exit 1
else
ConvertNum=$((convertN))
return $ConvertNum #pass the var to space land
fi
}
rst
# var to keep amount of dirs desired to be done per run of script
# amount of files in the dir may not allow to get done in one day
amount_of_dir_to_work_on=$ConvertNum
echo ""$working_dir" START - creating list of files"
# get all of the names of the base dir to change name a var containing ampunt of basenamedir in last place here
# amount_of_dir_to_work_on this is gotten off of the command line
find "$working_dir" -mindepth 1 -maxdepth 1 -type d | while [ $DirCountDn -lt $amount_of_dir_to_work_on ] ;
do read DIRNAME;
echo "$DIRNAME"
#get list of all files in dir and sub dir's of current Dir to work off of
MAXMP3="$(find "$DIRNAME" -type f -name "*.mp3" | wc -l)"
MAXFLAC="$(find "$DIRNAME" -type f -name "*.flac" | wc -l)"
echo;echo;echo
echo "amount of mp3 "$MAXMP3" in "$DIRNAME""
FilesCountInSecondLoop=$(($MAXMP3 + $MAXFLAC))
filesLeftToDo="$FilesCountInSecondLoop"
echo "Just starting off"
echo "MAXMP3 is : "$MAXMP3""
echo "MAXFLAC is : "$MAXFLAC""
echo "FilesCountInSecondLoop : "$FilesCountInSecondLoop""
echo "Files left to do : "$filesLeftToDo""
echo "cycleThroughFilesCount : "$cycleThroughFilesCount""
# MAXMP3 starts with a number
# if not equle to
# cycleThroughFilesCount starts with zero
find "$DIRNAME" -type f -name "*.*" | while [ $FilesCountInSecondLoop -ne $cycleThroughFilesCount ] ;
do read FILENAME;
#Directory to put the files back into it after resampling is completed
r=$FILENAME
c=$FILENAME
xpath=${c%/*}
xbase=${c##*/}
xfext=${xbase##*.}
xpref=${xbase%.*}
path=${xpath}
pref=${xpref}
ext=${xfext}
#checks to see if varitable is empty meaning no files to that extention to
#resample are left to do --
if [ -z "$ext" ]; then
echo "all Done - dar eay."
exit 1
fi
#############################
############################
###
### GET RID OF EVERYTHING THAT IS NOT A MP3 OR FLAC FILE
###
##############################################################
#Checks each movie file to see if it is just a not needed sample of the move to regain file space by deleting it
for file in "${path}" ; do
# echo "in for loop ext1 is -> "$ext""
if [[ "$ext" != 'flac' && "$ext" != 'mp3' && "ext" != 'jpg' ]]; then
# echo "in loop if statment ext is -> "$ext""
# echo "Removing "$FILENAME""
removeme="$FILENAME"
rm -v "$removeme"
# set a different ext type so that it will not go into following if statement due to it is still a movie extention
# causes it to skip over and go to next file
## ext1="foobar"
let InIfLoop++
# echo "in IF Loop ="${InIfLoop}""
fi
let inLoop++
#echo "inside of loop ="${inLoop}""
done
let leftLoop++
#echo "left loop count = "$leftLoop""
####################
###
### START ON MP3 or FLAC FILE
###
###############################################
#echo "Extention off before into first if statment "${ext}""
# echo
if [[ "${ext}" == 'mp3' || "${ext}" == 'flac' ]] ; then
echo;echo
echo $FILENAME " Looking to resample this FILE now!"
echo;echo
#############################################################
#get the metadata tags off the mp3's using exiftool-perl
#################
ALBUM1="`exiftool -Album "$FILENAME" -p '$Album'`"
ARTIST1="`exiftool -Artist "$FILENAME" -p '$Artist'`"
SongName="`exiftool -Title "$FILENAME" -p '$Title'`"
TRACK1=""
TRACK2=""
TRACK1="`exiftool "-Track Number" "$FILENAME" -p '$TrackNumber'`"
TRACK2="`exiftool -Track "$FILENAME" -p '$Track'`"
#GENRE1="`exiftool -Genre "$FILENAME" -p '$Genre'`"
# echo "track 1 -> "$TRACK1""
# echo "track 2 -> "$TRACK2""
#gets the number off the left side of file name if any then
# hopefully fixs it to tag track number in file
number=${pref//[^0-9 ]/}
number=${number%% *}
number=${number%/*}
#removes leading white space on both ends of string
number="$(echo -e "${number}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
# echo "NUMBER IS now = "$number""
if [ -z "${TRACK1}" ] && [ -z "${TRACK2}" ] ; then
id3v2 -T "$number" "${FILENAME}"
echo "aftering adding track"
TRACK1="`exiftool "-Track Number" "$FILENAME" -p '$TrackNumber'`"
TRACK2="`exiftool -Track "$FILENAME" -p '$Track'`"
echo "this is track1 "$TRACK1""
echo "This is TRACK2 "$TRACK2""
echo
fi
#replaces all the crap and the spaces
#between the names with an underscore
#"${x// /_}" meaning "${varName//search pattern/replace with}"
echo "GETTING OFF TAGS"
#echo
echo "ARTIST1 going in is "$ARTIST1""
newArt="${ARTIST1// / }"
newArt="${newArt#/*}"
newArt=${newArt//[^A-Za-z&0-9"'" ]/ }
newArt="$(echo -e "${newArt}" | tr "[A-Z]" "[a-z]" | sed -e "s/\b\(.\)/\u\1/g")"
#ensure only one space between each word
newArt="$(echo -e "${newArt}" | sed -e 's/\s+/ /g')"
#removes leading white space on both ends of string
newArt="$(echo -e "${newArt}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
echo "newArt comming out is -> "$newArt""
newTit="${SongName// / }"
newTit=${newTit//[^A-Za-z&0-9"'" ]/ }
#Capitalizes each word
newTit="$(echo -e "${newTit}" | tr "[A-Z]" "[a-z]" | sed -e "s/\b\(.\)/\u\1/g")"
#ensure only one space between each word
newTit="$(echo -e "${newTit}" | sed -e 's/\s+/ /g')"
#removes leading white space on both ends of string
newTit="$(echo -e "${newTit}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
#echo "NEW TITLE comming out is"
echo "$newTit"
#echo "ALBUM1 going in is -> "$ALBUM1""
newAlb="${ALBUM1%/*}"
newAlb=${newAlb//[^A-Za-z&0-9"'" ]/ }
#Capitalizes each word
newAlb="$(echo -e "${newAlb}" | tr "[A-Z]" "[a-z]" | sed -e "s/\b\(.\)/\u\1/g")"
#ensure only one space between each word
newAlb="$(echo -e "${newAlb}" | sed -e 's/\s+/ /g')"
#removes leading white space on both ends of string
newAlb="$(echo -e "${newAlb}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
echo "newAlb commming out is -> "${newAlb}""
#echo "DONE GETTING OFF TAGS"
#echo
#strip the orginal file name off the path from FILENAME
c=$FILENAME
xpath=${c%/*}
xbase=${c##*/}
xfext=${xbase##*.}
xpref=${xbase%.*}
path=${xpath}
pref=${xpref}
ext=${xfext}
####################################
c=$FILENAME
##############################
# if MP3 has no needed tag information then
# strips names off of directory folders then uses them
# as artist/band -- and album names in tags before renaming mp3 file
##########################
# echo "GETTING OFF OF DIRECTORIES"
# echo "STARTING TO EXTRACT DIRECTORIES NAMES"
file=${c##*/}
album1=${c#*"${c%/*/"$file"}"/}
Artist=${album1%/*}
Artist1=${c#*"${c%/*/"$album1"}"/}
album=${album1%%/*}
Artist2=${Artist1%%/*}
# echo "right here YO"
dir=${FILENAME#*/*/*/*/}
dir=${dir//\/*}
echo "$dir"
#rename directory
NewDirectoryName="$dir"
# echo "$NewDirectoryName"
NewDirectoryName=${NewDirectoryName%%'('*}
NewDirectoryName=${NewDirectoryName%%'320cbr'*}
NewDirectoryName=${NewDirectoryName%'[Bubanee]'*}
NewDirectoryName=${NewDirectoryName%'MP3'*}
NewDirectoryName=${NewDirectoryName%'2CD'*}
NewDirectoryName=${NewDirectoryName%'Discography'*}
NewDirectoryName=${NewDirectoryName%'discography'*}
NewDirectoryName=${NewDirectoryName//[^A-Za-z ]/ }
#Capitalizes each word
NewDirectoryName="$(echo -e "${NewDirectoryName}" | tr "[A-Z]" "[a-z]" | sed -e "s/\b\(.\)/\u\1/g")"
#ensure only one space between each word
NewDirectoryName="$(echo -e "${NewDirectoryName}" | sed -e 's/\s+/ /g')"
#removes leading white space on both ends of string
NewDirectoryName="$(echo -e "${NewDirectoryName}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
#echo "newAlb after striaghtening it up -> "${newAlb}""
# echo "NewDirectoryName is --- -> "$NewDirectoryName""
# echo
e=$FILENAME
xpath=${e%/*}
xbase=${e##*/}
xfext=${xbase##*.}
xpref=${xbase%.*}
path1=${xpath}
pref1=${xpref}
ext1=${xfext}
# echo "song off directory is -> "$pref1""
songTitle="${pref1}"
songTitle=${songTitle//[^A-Za-z&0-9"'" ]/ }
#Capitalizes each word
songTitle="$(echo -e "${songTitle}" | tr "[A-Z]" "[a-z]" | sed -e "s/\b\(.\)/\u\1/g")"
#ensure only one space between each word
songTitle="$(echo -e "${songTitle}" | sed -e 's/\s+/ /g')"
#removes leading white space on both ends of string
songTitle="$(echo -e "${songTitle}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
# echo "newAlb after striaghtening it up -> "${newAlb}""
# echo "new songTitle is -> "$songTitle""
# echo "DONE GETTING OFF OF DIRECTORIES"
#echo;echo;
if [ -z "$ALBUM1" ] ; then
id3v2 -A "$newAlb1" "${FILENAME}"
echo "tagging Album tag to file is -> "$newAlb1" "
echo
fi
if [ -z "$ARTIST1" ] ; then
id3v2 -a "$Artist" "${FILENAME}"
echo "tagging Artist tag to file is -> "$Artist" "
newArt=$Artist
echo
fi
if [ -z "$SongName" ] ; then
id3v2 -t "$songTitle" "${FILENAME}"
echo "tagging Title tag to file is -> "$songTitle" "
newTit=$songTitle
echo
fi
# MAKING NEW FILE NAME
###########################
ALBUM1="`exiftool -Album "$FILENAME" -p '$Album'`"
# echo "JFSDFSDFSDFSDFSDFSDFSDFSDFSDF"
function GetArt () {
if [[ ! -n "$ARTIST" ]]; then
Art=$((ARTIST))
#echo " got someting "
return $Art #pass the var to space land
fi
}
GetArt
echo "this is the newAt justbefore making newFIle "$newArt""
newFile=""${newTit}" - "${newArt}".mp3"
# get the size of the Orginal File and keep for later use
FileSize1="`exiftool '-File Size' "$FILENAME" -p '$FileSize'`"
#if song was already resampled it skips it then goes onto next one
echo "******************************************************************"
# echo "this is old file name about to be checked if matches new FileName"
# echo "right here -> "$pref" new File name -> "${newFile%.*}""
# echo
## REMOVE the Extention off of NewFile to check string
# if [[ "$pref" != "${newFile%.*}" ]] ; then
if [[ "$pref" == "${newFile%.*}" ]] ; then
echo;echo
echo "This file -> :: "${newFile%.*}" " :: has already been done, skipping""
let cycleThroughFilesCount++
let filesLeftToDo--
echo "amount of mp3 : "$MAXMP3" in "$DIRNAME""
echo "MP 3 left to do : "$filesLeftToDo""
echo "MP3 done : "$cycleThroughFilesCount""
echo;echo
else
#######################################
#
# CHECK BITRATE of MP3 = 192 - 160 vbr
# CHOP OFF ENDING .00000
# STORE IN VAR for checking value
#########################################
if [[ "${ext1}" == 'mp3' ]] ; then
#rateme="$(mp3info -r a -p "%r\n" "${FILENAME}")"
#rateis="${rateme%.*}" # strip off period and everything to the right of it
echo
rateis="$(mp3info -r m -p "%r\n" "${FILENAME}")"
echo "Bitrate for "$pref1"."$ext1" is $rateis"
echo
echo "LameCheckRate is "$LameCheckRate""
echo
echo "flac_convert_brate is "$flac_convert_brate""
echo;echo
fi
echo;echo
putback=${r%/*}
echo "THIS IS PUT BACK DIR = "$putback""
echo;echo; echo;echo; echo;echo; echo;echo; echo;echo
##############################################################
# Resampling FLAC with LAME 99.9.5
###
##
if [[ "${ext}" == 'flac' ]] ; then
echo "got Dflack file "${pref}"."${ext}""
echo "converting to "${flac_convert_brate}" /kbps mp3"
echo
flac -cd "$FILENAME" | lame -h -b "${flac_convert_brate}" - "$newFile"
echo;echo;
# get new bitrate and spit it out to the terminal
rateis="$(mp3info -r m -p "%r\n" "$script_dir"/"${newFile}")"
echo "Bitrate of .. $newFile .. is .. $rateis .."
echo;echo
eyeD3 -A "$newAlb" "${script_dir}"/"${newFile}"
echo "added "$newAlb" tag to file"
eyeD3 -a "$newArt" "${script_dir}"/"${newFile}"
echo "added "$newArt" tag to file"
eyeD3 -t "$songTitle" "${script_dir}"/"${newFile}"
echo "added "$songTitle" tag to file"
if [[ ! -n "${TRACK1}" ]] ; then
eyeD3 -n "$TRACK2" "${script_dir}"/"${newFile}"
echo "added T2 - "$TRACK2" tag to file"
else
eyeD3 -n "$TRACK1" "${script_dir}"/"${newFile}"
echo "added T1 - "$TRACK1" tag to file"
fi
eyeD3 -G "$GENRE1" "${script_dir}"/"${newFile}"
echo "added "$GENRE1" tag to file"
echo;echo
echo "after insert info "
echo;echo "after reasiging FLAC resmapling" echo
echo
fi
##############################################################
# Resampling MP3 with LAME 99.9.5
###
#flack file resampled into a MP3 falls through here and gets moved too
# if MP3 is out of limits then re-sample it if not then send it through
if [[ "${ext}" == 'mp3' ]] ; then
# start bitrate 128 start bitrate 160
if [[ "${rateis}" -gt "${LameCheckRate}" ]] ; then
lame -V2 -b"${LameLowEnd}" -B"${LameHighEnd}" -F --vbr-new -m j -q2 "$FILENAME" "$newFile"
echo
echo "MOVING FILES NOW!"
echo
echo "$newFile"
echo
## Resampled file is newFile located in script dir
rm -v "${FILENAME}"
echo;echo
mv -v "${script_dir}"/"${newFile}" "${putback}"
echo
fileplace="${putback}"/"${newFile}"
id3v2 -A "$newAlb" "${fileplace}"
id3v2 -a "$newArt" "${fileplace}"
id3v2 -t "$newTit" "${fileplace}"
echo;echo "after move"
exiftool "${putback}"/"${newFile}"
let filesLeftToDo--
let cycleThroughFilesCount++
echo;echo "mp3's done "$cycleThroughFilesCount""
else
# if MP3 is within limits then skip resmapling then just make
# a copy to move it
# to new directory/folder
## WORKING SCRIPT DIRECTORY !
echo;echo "is not needing resampling"
echo "$pref1"."$ext"
echo;echo "new file name is -> "${newFile}""
echo
#if old file name changed the change it
compareme="${putback}"/"${newFile}"
if [[ "${FILENAME}" != "${compareme}" ]] ; then
mv -v "${FILENAME}" "${putback}"/"${newFile}"
echo;echo "after not needing resample"
echo
exiftool "${putback}"/"${newFile}"
let filesLeftToDo--
let cycleThroughFilesCount++
echo;echo "mp3 done "$cycleThroughFilesCount""
fi
echo;echo
eyeD3 -A "$newAlb" "${putback}"/"${newFile}"
echo "Non resampled stats"
#exiftool "${script_dir}"/"${newFile}"
fi
fi # end first if
echo "Total MP3's Files are : "$MAXMP3""
echo "Files done so far is : "$cycleThroughFilesCount""
echo "MP3's left to do are : "$filesLeftToDo""
# echo "After mp3 resampling file ->"
# exiftool "${script_dir}"/"${newFile}"
# I use EXIFTOOL because it works on FLAC files too for
# extracting the information
echo;echo;
# get the size of the finished file to show differece in size of file
echo "putback is -------- "$putback""
checkme=""${putback}"/"${newFile}""
FileSize2="`exiftool '-File Size' "$checkme" -p '$FileSize'`"
fi
fi # end checking string for done file
###########################################
## DO THE MATH ON MEGABYTES SAVED #########
###########################################
# if it cathces a KB file then it throws off the math. adding
# this keeps MB rounded up to the nearest whole one MB.
echo
Hold1=$FileSize1
Hold2=$FileSize2
k1="${Hold1#* }"
echo ""$k1" -- k1"
if [[ "$k1" == 'kB' ]] ; then
MB1=1
else
MB1="${FileSize1% *}"
fi
k2="${Hold2#* }"
echo ""$k2" -- k2"
if [[ "$k2" == 'kB' ]] ; then
MB2=1
else
MB2="${FileSize2% *}"
fi
# if it cannot stat file -- file unfound - bad file - then put a
# zero in place of nothing to keep the total
if [[ "$FileSize1" == "" ]] ; then
MB1=0
fi
if [[ "$FileSize2" == "" ]] ; then
MB2=0
fi
echo " "$MB1" MB1 - start size"
echo "- "$MB2" MB2 - ending size"
# doing math on MB's
totalSaveOnFile=`echo $MB1 - $MB2 | bc`
echo "----------"
echo " "$totalSaveOnFile" MB - regained space"
echo "%%%%%%%%%%%%%%%"
echo
#maxSaved=$(( totalSaveOnFile + maxSaved ))
maxSaved=`echo $totalSaveOnFile + $maxSaved | bc`
echo
echo "%%%%%%%%%%%%%%%%%%"
echo;echo;echo
echo "***************************************"
echo;echo;echo
echo "AT IF STATMENTS"
echo "FILENAME is "$FILENAME""
NEWFILENAME=${FILENAME%/*}
#DIRNAME=${DIRNAME#*/*/*/*/}
#DIRNAME=${DIRNAME//\/*}
echo "DIRNAME is "$DIRNAME""
echo "before if to do it"
echo "FilesCountInSecondLoop : "$FilesCountInSecondLoop""
echo "MAXMP3 : "$MAXMP3""
if [[ "$FilesCountInSecondLoop" == "$cycleThroughFilesCount" ]] ; then
echo " in if fileCount check"
echo " NEWFILENAME is "${NEWFILENAME}""
echo "new file is "${newFile}""
ARTIST1="`exiftool -Artist "${NEWFILENAME}"/"${newFile}" -p '$Artist'`"
NewDirName="$ARTIST1"
echo "new dir name is "$NewDirName""
echo "this is MP3Count - "$MP3Count""
#var names for dir nd paths and string compair
OldDirName="$DIRNAME"
echo;echo "OldDirName "$OldDirName""
stringOldDir=${DIRNAME#*/*/*/*/}
stringOldDir=${stringOldDir//\/*}
echo;echo "stringOldDir "$stringOldDir""
stringNewDir="$NewDirName"
echo;echo "stringNewDir "$stringNewDir""
oldDirPathNewName=""$working_dir"/"$NewDirName""
echo;echo "oldDirPathNewName "$oldDirPathNewName""
# if orginal dir name does not equals artist Tag name
# change the dir to Artist Tag name then move it
if [[ "$stringOldDir" != "$stringNewDir" ]] ; then
echo "not = "$stringOldDir" to "$stringNewDir""
#change name of dir to artist/band name
echo "mv OldDirName "$OldDirName" to "$oldDirPathNewName""
echo "Working dir "$working_dir""
#change old dir name to new dir name
mv -v "$OldDirName" "$oldDirPathNewName"
#then check to be sure root dir to move it to is there
if [[ ! -d "$move_to" ]] ; then
echo "inside if more to dir is there"
mkdir -v "$move_to"
#then move the new dir name to a different
# place for safe keeping
echo;echo "just befor move "
echo "oldDirPathNewName "$oldDirPathNewName" move to "$move_to""
mv -vf "$oldDirPathNewName" "$move_to"
else
echo "ELSE oldDirPathNewName "$oldDirPathNewName" move to "$move_to""
#if dir already created then just move the new dir there
mv -vf "$oldDirPathNewName" "$move_to"
fi
fi
#if old dir name matches Artist Tag then insure more to dir is there then move it there
if [[ "$stringOldDir" == "$stringNewDir" ]] ; then
echo "Match strings "$stringOldDir" and "$stringNewDir""
if [[ ! -d "move_to" ]] ; then
mkdir -v "$move_to"
mv -vf "$OldDirName" "$move_to"
else
mv -fv "$OldDirName" "$move_to"
fi
fi
fi
done
let DirCountDn++
echo "Dir Count Dn "$DirCountDn""
echo "******************************************"
echo;echo;echo
done #FOR DIR Names
답변1
mv 명령은 인수 유형에 따라 다양한 작업을 수행할 수 있으며 어떤 경우에는 정확히 원하는 작업을 수행하지 못할 수도 있습니다. 실제로 비어 있지 않은 두 개의 디렉터리 병합을 처리하지 않습니다.
이것문서설명하다:
대상 경로가 존재하면 mv는 이를 삭제하려고 시도합니다. 어떤 이유로든 실패하면 mv는 표준 오류에 진단 메시지를 쓰고 현재 소스 파일에 대해 아무 작업도 수행하지 않으며 나머지 소스 파일을 계속 처리합니다.
이것이 바로 여기서 만나는 것입니다. mv dbyls /m/d/t/dbyls
, 두 인수가 모두 디렉터리인 경우 삭제가 시도됩니다 /m/d/t/dbyls
. 디렉터리가 비어 있지 않으면 삭제가 실패합니다.
일반적인 해결 방법은 먼저 실행 mv dblys/* /m/d/t/dbyls
한 다음 실행하는 것 입니다 rmdir dblys
. 쉘 환경에 따라 로 *
시작하는 파일과 일치하는 항목이 없을 수도 있습니다 ..
답변2
두 단계로 수행할 수 있습니다. 먼저 파일을 이동한 다음 현재 비어 있는 상위 디렉터리를 삭제합니다.
mkdir -p to/there
mv from/here/* to/there
rmdir from/here
특정 경우에는 조각
if [[ "$stringOldDir" == "$stringNewDir" ]] ; then
echo "Match strings "$stringOldDir" and "$stringNewDir""
if [[ ! -d "move_to" ]] ; then
mkdir -v "$move_to"
mv -vf "$OldDirName" "$move_to"
else
mv -fv "$OldDirName" "$move_to"
fi
fi
대신 다음과 같은 것을 사용할 수 있습니다.
mkdir -p "$move_to/$OldDirName"
mv "$OldDirName"/* "$move_to/$OldDirName"
rmdir "$move_to/$OldDirName"
답변3
상위 디렉터리가 다른 제거 기본 폴더에 생성되었는지 확인하고, true인 경우 해당 폴더에 복사하고 이전 디렉터리를 삭제하고, 그렇지 않으면 전체 디렉터리를 이동합니다.
## check to see if other parent dir is there if not then make it so
if [[ ! -d "$move_to" ]] ; then
mkdir -v "$move_to"
fi
# if old dir does not match new dir name then change it
if [[ "$stringOldDir" != "$stringNewDir" ]] ; then
echo "not = "$stringOldDir" to "$stringNewDir""
#change name of dir to artist/band name
echo "mv OldDirName "$OldDirName" to "$oldDirPathNewName""
#change old dir name to new dir name
mv -v "$OldDirName" "$oldDirPathNewName"
fi
#check if other parent dir and artist are there if not handle it
if [[ ! -d "$move_to"/"$stringNewDir" ]] ; then
echo "inside ck if move to parent / artist to dir is there"
echo
echo ""$move_to"/"$stringNewDir" is not there moving "$stringNewDir""
echo
#then move the new dir name to a different
# place for safe keeping
echo
echo;echo "just befor move "
echo
echo "oldDirPathNewName "$oldDirPathNewName" move to "$move_to""
echo
mv -vf "$oldDirPathNewName" "$move_to"/"$stringNewDir"
echo
else
echo ""$move_to"/"$stringNewDir" is there moving within it into"
echo
echo "$move_to"/"$stringNewDir"
echo
moveinsideof="$oldDirPathNewName"
echo
cp -Rv "${moveinsideof}"/* "$move_to"/"$stringNewDir"
echo
rm -rv "$oldDirPathNewName"
fi
fi
답변4
옵션 1 - 사용rsync + rm
매뉴얼 페이지에 문서화되어 있지는 않지만 mv
대상 디렉토리에 파일이 포함되어 있으면 디렉토리 이름을 다른 디렉토리로 바꾸는 것이 거부됩니다. 당신이 결과를 원하기 때문에 이것은 당신에게 좋은 일입니다.병합소스의 내용을 대상에 넣는 것은 mv
작동하지 않습니다.
대신 사용하십시오 rsync -a backup/ backupArchives/
. 이후 rm -rf backup/*
.
를 사용하는 것 외에도 rsync
기본 작업을 수행할 수도 있습니다.
(cd backup && tar c .) | (cd backupArchives && tar xf -)
이렇게 하면 더 많은 괴짜 포인트를 얻을 수 있습니다.
옵션 2 - 사용cp + rm
빠르고 지저분하게, 당신이 무엇을 하고 있는지 알고 있다면:
cp -r ./backup/* ./backupArchives && rm -R ./backup/*
인용하다:https://askubuntu.com/questions/269775/mv-directory-not-empty/269818#269818