이름이 해상도 크기로 끝나지 않는 이미지 파일을 복사하는 방법은 무엇입니까?

이름이 해상도 크기로 끝나지 않는 이미지 파일을 복사하는 방법은 무엇입니까?

이미지가 포함된 폴더가 있는데 연도 및 월 폴더로 구성되어 있습니다(예: /2015/08/image.jpg). 이미지가 추가될 때마다 다음과 같이 복사되고 크기가 조정됩니다.

image-1024x768.jpg
image-150x150.jpg
image-300x225.jpg
image-600x450.jpg
image.jpg

매년, 매월 폴더를 검색하여 원본 파일만 시스템의 다른 폴더에 복사하는 스크립트를 만들고 싶습니다.

정규식을 사용해야 할 것 같은데 방법을 모르겠습니다.

편집: 다음은 몇 가지 예시 파일 이름입니다. 옆에 별표(*)가 있는 콘텐츠는 복사해야 하는 유일한 콘텐츠입니다.

1450366623-20151217-109x300.png
1450366623-20151217-150x150.png
1450366623-20151217-372x1024.png
1450366623-20151217-600x1650.png
1450366623-20151217.png*
image-3-1024x768.jpeg
image-3-150x150.jpeg
image-3-225x300.jpeg
image-3-300x225.jpeg
image-3-600x450.jpeg
image-3-600x800.jpeg
image-3-768x1024.jpeg
image-3-768x576.jpeg
image-3.jpeg*
IMG_0939-1-1024x768.jpg
IMG_0939-1-150x150.jpg
IMG_0939-1-300x225.jpg
IMG_0939-1-600x450.jpg
IMG_0939-1-768x576.jpg
IMG_0939-1-e1451106610990-150x150.jpg
IMG_0939-1-e1451106610990-225x300.jpg
IMG_0939-1-e1451106610990-600x800.jpg
IMG_0939-1-e1451106610990-768x1024.jpg
IMG_0939-1-e1451106610990.jpg*
IMG_0939-1.jpg*

편집 2: 이미지가 월/년 폴더별로 구성되어 있다고 말했는데, 이는 그것이 재귀적이어야 한다는 것을 의미한다고 확신합니다. 하지만 2015년 옆에는 복사되지 않았으면 하는 다른 폴더가 있습니다.

이러한 사진을 복사할 때 폴더 구조를 복사할 수 있나요?

편집 3: 내 질문에 답변해 주신 모든 분들께 감사드립니다. 나는 이 프로젝트에 압도되어 포기하기로 결정했다는 사실을 사과하고 슬프게도 인정해야 합니다. 대부분의 답변을 구현하는 방법조차 잘 모르겠습니다.

답변1

정규 표현식은 필요하지 않으며 확장된 와일드카드 패턴이 필요합니다. 귀하의 쉘이 bash라고 가정합니다.

shopt -s extglob
cd parent-directory-of-2015
for original in */*/!(*-+([0-9])x+([0-9]).jpg); do
    echo "an original: $original"
done

이 모드는들어오지 못하게 하다일치하는 파일이 있습니다"-숫자x숫자.jpg"

답변2

이름에 이미지 크기 이내의 x를 사용해도 될 것 같아서 이렇게 작성하겠습니다. 하위 문자열을 사용하여 이름에 x가 포함되지 않은 파일을 찾은 다음 다른 파일은 그대로 두고 모든 파일을 복사합니다.

#!/bin/bash

typeset -i count
let count=0

MAXF="$(find /path -type f -name "*.*" | wc -l)"

find /path   -type f -name "*.*" | while [[ $count -ne $MAXF ]] ;
 do read FILENAME;

name=${FILENAME##*/}
substring="x"

if [[ "$name" != *"$substring"* ]] ; then
     cp -v "$FILENAME" /path/newname
     ((count++))
fi
((count++))
 done

나는 이것을 테스트하지 않았습니다... 즉석에서 만든 것이지만 이것은 당신의 작은 프로젝트와 관련하여 이미 생각했던 다른 것들을 성취할 것입니다.

"이 사진을 복사할 때 폴더 구조도 복사할 수 있나요?"라는 질문에 대해서는 네, 그런데 일부 파일만 복사하면 모든 파일을 비슷한 구조로 복사하는 것이 아니라 다른 폴더에 복사하게 됩니다. 상위 디렉토리에 있는 경우 복잡한 스크립트가 될 수 있습니다.

동일한 하위 디렉터리 구조를 가지려면 다른 파티션이나 상위 디렉터리 이름에 있어야 하기 때문입니다. 다음은 비슷한 작업을 수행하는 스크립트의 일부입니다.

이 기사가 작업을 수행하기 위해 변수, 명령줄 및 논리를 사용하는 방법을 파악하는 데 도움이 되기를 바랍니다. ...이전의 자세한 코드는 나머지 코드가 제대로 작동하도록 준비됩니다. srtipt_dir을 사용하기 위해 디렉토리 경로를 설정하는 처음 세 개의 명령문은 실제로 스크립트에 필요하지 않을 수 있으며, 모두 원하는 항목으로 만들기 위해 스크립트에서 수행하는 방법과 작업에 따라 다릅니다. move_to를 copy_to로 변경할 수 있습니다.

다음은 한 번에 하나의 "기본" 디렉터리를 처리한 다음 트리와 해당 하위 디렉터리의 다른 "기본" 디렉터리로 이동하기 전에 해당 디렉터리의 각 파일을 반복하는 두 가지 루프 설정입니다. 동일한 디렉토리 이름이 이미 존재하는지 확인하기 위해 트리 구조의 다른 분기를 확인하고, 그렇지 않은 경우 트리의 새 분기로 이동하고, 그렇다면 분기의 내용을 다른 분기에 복사한 다음 트리 구조를 복사합니다. 트리의 이전 분기(dir 구조)에 남아 있는 모든 항목을 삭제합니다.

조치를 취하기 전에 먼저 에코를 사용하여 작업을 확인하세요.

#!/bin/bash

script_dir="path"
files_dir="path"
move_to="path/dirName"

........ 

    # if this is say /home/picures/myFotos
    # then this statment will check the last dir name is there
    # if it is not there. It will then create it.

   # you will have to then take off of the old dir structor and 
   # recreate it off of this statement

    if [[ ! -d "$move_to" ]] ; then
            mkdir -v "$move_to"
        fi

      # set for 5th Directory to be Artist Dir
        echo;echo
        OldDirName=${DIRNAME#*/*/*/*/*/}                        
        echo "1 - OldDirName $OldDirName"
        echo
        OldDirName=${OldDirName//\/*}
        echo "2 - OldDirName $OldDirName"
        echo
        echo;echo "OldDirName : $OldDirName"
        echo
    # if no artist on file tag present then keep orginal DirName
        if [ ! -z "$changeDirName" ] ; then

            newDirName="$changeDirName"
        else
            #if no Artist MetaData 
            newDirName="$OldDirName"
        fi

########### CHANGE NAME OF PARENT DIR WHERE IT IS AT FIRST
        echo;echo "Old Dir Name != newDirName " echo "this is MP3Count - "$MP3Count""


        echo;echo "[[ "$OldDirName" != "$newDirName" ]]"


        if [[ "$OldDirName" != "$newDirName" ]] ; then 


            oldDirPathNewName=""$working_dir"/"$newDirName""
            Dir="$newDirName"
            echo;echo "oldDirPathNewName "$oldDirPathNewName""
            echo ""$OldDirName" not = to "$newDirName""

           #change name of dir to artist/band name
            echo "mv "$OldDirName" to "$oldDirPathNewName""

            #change old dir name to new dir name
            #mv -v "$working_dir"/"$OldDirName" "$oldDirPathNewName"

            mv -v "$working_dir"/"$OldDirName" "$oldDirPathNewName"
            echo
        else
            Dir="$OldDirName"
        fi





            from=""$working_dir"/"$Dir""
            to=""$move_to"/"$Dir""          

    #check if the desanation directory is already there if not move it or 
    # copy it into it then remove left overs 

        if [[ ! -d "$to" ]] ; then
        #move_to"/"$Dir" ]] ; then



            echo "inside ck if move to parent / artist to dir is there"
            echo
            echo ""$move_to"/"$Dir" is not there moving "$Dir""
            echo                                    
            #then move the new dir name to a different
            # place for safe keeping
            echo
            echo;echo "just befor move "
            echo
            echo

            echo "$from -> $to"
            mv -vf "$from" "$to"

            echo    
            echo "DirIsaidtoDo Left : $DirIsaidtoDo"
            echo        

        else


            echo ""$move_to"/"$stringNewDir" is there moving within it into"
            echo
            echo "$move_to"/"$stringNewDir"
            echo

            echo
            cp -Rv "${from}"/* "$to"  
            echo
            rm -rv "$from"
            echo
            echo "DirIsaidtoDo Left : $DirIsaidtoDo"
            echo
        fi

    fi                           

            echo "********** NEXT FILE ***********************"     

        done
        let DirCountDn++
        echo "Dir Count Dn "$DirCountDn"" 
        echo "******************************************" 
        let AmountDirs--
        echo "Amount Dirs to go $AmountDirs"
        echo
        let DirIsaidtoDo--

        echo;echo;echo


    done #FOR DIR Names

경로 디렉토리 생성 순서에 따라 여러 디렉토리를 생성하려면 상위 디렉토리와 하위 디렉토리를 설정하는 동안 모든 dirName을 생성합니다.

 mkdir -pv path/dirName/DirName/DirName

관련 정보