비어 있지 않은 디렉터리를 이동할 수 없습니다.

비어 있지 않은 디렉터리를 이동할 수 없습니다.

사람들이 더 많은 것을 알고 싶어하기 때문에 편집되었으며 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

관련 정보