이전 접미사에 따라 파일 이름에 접미사 추가 현재 연도 접미사가없는 모든 파일

같은 파일이 들어있는 폴더가 있습니다

ABC-2001
DEF
EFG-2001-2002
HIJ
KLM-2003
NOP
QRS-2004

현재 연도 접미사가없는 모든 파일 이름에 연도를 추가하고 싶습니다. 접미사는 항상 접미사가 1 년인 마지막 파일 중 하나 여야합니다. EFG2001과 2002의 시작을 포함하므로 HIJ접미 부 2002가 필요합니다.

어떻게해야합니까?



답변

당신이 지정한 파일 이름에 대해 그렇게해야합니다. 이름 부분은 대문자, 공백 및 대시로 구성되어 있다고 가정합니다. 그리고 2 년이 존재하는 경우, 그것들은 대시로 분리됩니다. 또한 첫 번째 파일에 연도가 포함되어 있지 않다고 가정하고 (그렇지 않으면 공제 할 것이 없습니다) 디렉토리에있는 모든 파일을 처리합니다.

터미널에 복사하여 붙여 넣기를하고, 제대로 수행되는지 먼저 확인하려면 앞에을 추가 echo하십시오 mv.

for FILENAME in *
do
  # remove name part
  TRIM=`echo $FILENAME | sed -E 's/[A-Z -]*//'`
  # remove possible start year
  TRIM=`echo $TRIM | sed -E 's/[0-9]*-//'`
  if [ -z "$TRIM" ]
  then
    # file name didn't include year
    mv "$FILENAME" "$FILENAME - $YEAR"
  else
    # file name did include year
    YEAR=$TRIM
  fi
done

답변

-- open a finder window to allow the user to select the target folder
-- a logfile will be created on the desktop
-- set PROCESS_RENAME to true to disable demo mode !!!!

property PROCESS_RENAME : false
property DEFAULT_SUFFIX : "XXXX"
property DIGITS : {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}
property LOGFILE : "~/Desktop/renaming.log"

tell application "Finder"
    set currentSuffix to DEFAULT_SUFFIX

    -- let the user select the target folder
    set targetFolder to (choose folder with prompt "Select the target folder:")

    display dialog "The following folder files will be renamed: " & linefeed & POSIX path of targetFolder
    my logfunc(linefeed & "New folder renaming on folder: " & POSIX path of targetFolder & linefeed)

    -- get the target folder files
    set folderFiles to name of every file of entire contents of targetFolder

    -- iterate on each file found
    repeat with targetFile in folderFiles
        set fileExtension to ""
        set fileBaseName to targetFile

        -- extract file base name and file extension
        -- expect file extension to be something like ".XXX"
        if (targetFile contains ".") then
            -- point found so extract base name and extension
            set fileExtension to (characters -4 thru -1 of (targetFile as text)) as text
            set fileBaseName to (characters 1 thru -5 of (targetFile as text)) as text
        end if

        -- extract suffix from base file or filename if no extension found
        set newSuffix to extract_year_suffix(fileBaseName) of me

        -- suffix found on the new file ?
        if (length of newSuffix is greater than 0) then
            set currentSuffix to newSuffix
            set msg to ("FileName: " & targetFile & " >> No name change!")
            my logfunc(msg)
        else
            set newFileName to (fileBaseName & " - " & currentSuffix & fileExtension)

            if (PROCESS_RENAME) then
                -- rename file via shell script
                set sourcePath to (quoted form of (POSIX path of targetFolder & targetFile))
                set destPath to (quoted form of (POSIX path of targetFolder & newFileName))

                my rename_file(sourcePath, destPath)
            else
                set msg to ("DEMO: Old Name: " & targetFile & " >> New Name: " & newFileName)
                my logfunc(msg)
            end if
        end if
    end repeat
    display dialog "End of renaming folder: " & linefeed & POSIX path of targetFolder
end tell

to extract_year_suffix(fileBaseName)
    set found_suffix to ""
    -- check presence of year suffix
    if fileBaseName contains "-" then

        -- extract the last 4 chars
        set theLast4Chars to (characters -4 thru -1 of fileBaseName)
        -- check all the last 4 Chars are digits
        set allAreDigits to true
        repeat with aChar in theLast4Chars
            if aChar is not in DIGITS then
                set allAreDigits to false
                exit repeat
            end if
        end repeat

        if allAreDigits then
            set found_suffix to (theLast4Chars as text)
            return found_suffix
        end if
    end if
    -- no year suffix found
    return ""
end extract_year_suffix

on logfunc(msg)
    do shell script "echo '" & msg & "' >> " & LOGFILE
end logfunc

on rename_file(sourcePath, destPath)
    try
        set shellCommand to "mv -f " & sourcePath & " " & destPath
        my logfunc(shellCommand)
        do shell script shellCommand
    on error line number num
        display dialog "rename_file: Error on line number " & num
    end try
end rename_file

아마도 최선의 방법은 아니지만, 저는 애플 스크립트 전문가가 아닙니다.