이미지가 포함된 폴더가 있는데 연도 및 월 폴더로 구성되어 있습니다(예: /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