我有一个包含图像的文件夹,它按年和月文件夹组织(即/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
您不需要正则表达式,您需要扩展的通配模式。我假设你的 shell 是 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
我没有测试这个......它是即兴的,但这将完成您已经想到的与您的小项目相关的其他事情。
对于问题的这一部分“复制这些图片时,是否也可以复制文件夹结构?”是的,但如果您只复制一些文件,而不是将所有文件复制到类似的结构体中,而是复制到不同的父目录中,那么它可能会成为一个复杂的脚本。
因为它必须位于不同的分区或父目录名称上才能具有相同的 subDirectory 结构体。这是我的一个脚本的片段,我在其中做了一些类似的事情。
希望这篇文章将帮助您弄清楚如何使用变量和命令行以及完成任务的逻辑。 ...在此之前的详细代码将就位,以便该代码的其余部分正常工作。前三个语句设置您的目录路径以使用 srtipt_dir 在您的脚本中可能并不真正需要,这完全取决于您在脚本中执行的操作方式和操作以使其成为所需的项目。 move_to可以改为copy_to。
这是我正在使用的两个循环设置,一次处理一个“基本”目录,然后遍历该目录中的每个文件,然后再移动到树及其子目录中的另一个“基本”目录。检查树结构的不同分支以查看相同的目录名称是否已存在,如果不存在,则将其移动到树上的新分支中,如果是,则将分支的内容复制到另一个分支中然后,树结构体删除树的旧分支(dir 结构体)中剩下的任何内容。
在付诸行动之前,首先使用 echo 来检查你的工作
#!/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
要在路径目录创建顺序中创建多个目录,这将创建所有 dirNames,同时设置父目录及其子目录
mkdir -pv path/dirName/DirName/DirName