我有一个包含数百个文件夹的文件夹。这些文件夹包含每个文件夹,称为图像,在此文件夹中,有时会有严格命名的.jpg文件。有时文件夹中还有其他JPG文件,但如果它们不是严格的数字,则需要忽略这些文件。
我想学习如何编写一个脚本,当在给定文件夹中运行时,遍历每个子文件夹并查找此数字文件。然后,如果此类文件尚不存在,则会将“_n”后缀添加到每个后缀的副本。
这可以通过unix终端轻松完成吗?
更具体地说,这是我正在处理的结构:
脚本运行后,情况如下:
更新:抱歉打字错误,我不小心将2235放入47772。 更新2:关于math.coffee的答案的第二个评论,我目前在(在工作中)的操作系统是MacOS,但我的主要机器在家里运行CentOS和Ubuntu,所以我假设我的情况适用于所有基于unix的系统
答案 0 :(得分:4)
您可以使用-regex
切换到find
来匹配/somefolder/images/numeric.jpg
:
find -type f -regex './[^/]+/images/[0-9]+\.jpg$'
编辑:来自@JonathanLeffler的优化:添加-type f
以便查找以便它只查找文件(即与名为'12345.jpg'的目录不匹配)。
./[^/]+/
用于第一个文件夹(如果第一个文件夹始终是数字文件夹,则可以将其更改为[0-9]+
)。
[0-9]+\.jpg$
表示文件名仅为数字的jpg文件。
您可能希望将jpg
更改为jpe?g
以允许.jpeg
,但这取决于您。
然后将这些复制到xxx_n.jpg
。
for f in $(find -type f -regex './[^/]+/images/[0-9]+\.jpg$')
do
# replace '.jpg' in $f (filename) with '_n.jpg'
newf=${f/\.jpg/_n\.jpg}
# see if this new file exists
if [ ! -f $newf ];
then
# if not exists, copy it.
cp "$f" "$newf"
fi
done
答案 1 :(得分:1)
文件夹47772中重命名的逻辑应该是什么?如果我们假设您要将所有包含数字的文件重命名为数字+ _n
使用mmv
,您可以将其写成:
mmv "[0-9][0-9]*.jpg" "#1#2#3_n.jpg"
注意:mmv
用于移动; mcp
用于复制,因此更适合此问题。
维达的问题: 好吧,我检查了手册页,问题是它有点奇怪。 我在想[0-9] *会匹配零个或多个数字。我发现这个假设是错误的。 问题是,我无法告诉我在名称的开头需要两个或更多数字。
所以[0-9] [0-9] *匹配一个以至少两个数字开头的名称(之后它将所有其余的数据带到...现在每个[0-9]都是一个模式,所以我不得不把模式变成: “#1#2#3_n.jpg”例如1234.jpg我有#1 = 1; #2 = 2,#3 = 34所以
#1#2#3 -> 1234; _n appends the _n and .jpg the extension
然而,它会使用12some_other_stuff.jpg sot 12some_other_stuff_n.jpg重命名文件。它并不理想,但在这种情况下实现了预期目标。