名前が解像度サイズで終わらない画像ファイルをコピーするには?

名前が解像度サイズで終わらない画像ファイルをコピーするには?

画像を含むフォルダがあり、年と月のフォルダで構成されています(例/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を使用するためのディレクトリパスを設定する最初の3つのステートメントは、実際にはスクリプトに必要ではないかもしれません。 move_to を copy_to に変更できます。

以下は、一度に1つの「デフォルト」ディレクトリを処理してから、ツリーとそのサブディレクトリの別の「デフォルト」ディレクトリに移動する前に、そのディレクトリ内の各ファイルを繰り返す2つのループ設定です。同じディレクトリ名がすでに存在することを確認するには、ツリー構造の別のブランチを確認し、そうでない場合はツリーの新しいブランチに移動し、その場合はブランチの内容を別のブランチにコピーし、ツリー構造をコピーします。ツリーの前の分岐(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

関連情報