画像を含むフォルダがあり、年と月のフォルダで構成されています(例/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