gpt4 book ai didi

bash - 用于查找 JPG 和 MOV 文件的 Shell 脚本

转载 作者:行者123 更新时间:2023-11-29 09:27:40 25 4
gpt4 key购买 nike

背景

iPhone 有实时照片,我想我可以在 Windows 上使用 VLC 或某些 iPhone 应用程序来拍摄所需画面的静止图像。长话短说,你可以,但图像质量和分辨率都会大大降低。所以我放弃了。

问题

我在实时照片旁边隐藏了真实的电影文件

我的目标

使用 cygwin 运行 bash shell 脚本以遍历 0000 到 9999 并仅查找所有具有相同名称的 JPG 和 MOV 文件。

问题

我在使用 regex 时遇到问题

我试过 ls | grep -E "IMG_0016\.(JPG|MOV)"

我需要一个 bash 脚本,如果它找到给定文件名的 both jpg 和 mov 文件,它将返回 true。这在一个类轮中可行吗?谁能给我一些关于如何使上述 bash 命令更健壮的想法?

它找到了两个,但我怎么说,好的,干得好,你有两个,现在对这两个文件执行以下操作。

编辑

!/bin/庆典

for i in $(seq -f "%04g" 0 20)
do
FILENAME="IMG_$i"
#echo "$FILENAME"
var=$(ls -l | grep "$FILENAME" | grep -E "(JPG|MOV)" | wc -l)
if [ "$var" == 2 ] ; then
echo we found both for $FILENAME
echo $var
fi
done

输出

we found both for IMG_0018
2
we found both for IMG_0019
2

预期

目录中的文件是:

  • IMG_0016.JPG
  • IMG_0018.JPG
  • IMG_0018.MOV
  • IMG_0019.JPG
  • IMG_0019.MOV

评论

这很好,因为它只查找 2 个文件,但必须有更好的方式来表示查找 ONE JPG 和 ONE MOV??

编辑 2

#!/bin/bash

for i in $(seq -f "%04g" 0 20)
do
FILENAME="IMG_$i"
#echo "$FILENAME"
var=$(ls -l | grep "$FILENAME" | grep -E "(JPG|MOV)" | wc -l)
#echo $var
if [ "$var" == 2 ] ; then
#echo we found both for $FILENAME
var=$(ls -l | grep "$FILENAME" | grep -E JPG | wc -l)
if [ "$var" == 1 ] ; then
var=$(ls -l | grep "$FILENAME" | grep -E MOV | wc -l)
if [ "$var" == 1 ] ; then
mv "D:\Mike\Pictures\TEST\\$FILENAME.JPG" "D:\Mike\Pictures\TEST\MATCH\\$FILENAME.JPG"
mv "D:\Mike\Pictures\TEST\\$FILENAME.MOV" "D:\Mike\Pictures\TEST\MATCH\\$FILENAME.MOV"
fi
fi
fi
done

最佳答案

awk 助您一臂之力!

$ ls -1 | awk -F. '$2~/^(JPG|MOV)$/{a[$1]++} a[$1]>1{print $1}'

将在两个扩展名都存在的情况下打印不带后缀的文件名。如果要打印两个文件名,请将最后一个打印 block 更改为{打印 $1".JPG";打印 $1".MOV"}

ls -1 创建文件列表,每行一个文件。 awk -F. 告诉 awk 使用点作为字段分隔符,以便第二个字段是扩展名。我们检查第二个字段是否匹配任一选择。如果是这样,请递增以文件名索引的数组。由于文件名是唯一的(最多扩展名),因此任何大于 1 的值都应该是这两个扩展名。在最后一个 block 中,我们检查该条件并打印。假设文件名除了扩展名之前没有点分隔符。

您可以将标准工具与过滤列表一起使用,例如管道到

... {print $1}' | xargs -I file mv file.{JPG,MOV} targetdirectory

将 targetdirectory 替换为真实名称。请注意,{print $1} 是更好的选择。

更新 根据更新的要求,文件名的字母后缀将被忽略,如果存在三个文件实例,它们也需要被过滤。这需要稍微改变一下,首先过滤文件名的字母后缀(一个或多个),并仅在计数为 2 的末尾打印文件列表。

awk -F. '$2~/^(jpg|mov)$/{sub(/[a-z]+$/,"",$1); a[$1]++} 
END{for(k in a) if(a[k]==2) print k}'

并像以前一样通过管道传输到 mv

关于bash - 用于查找 JPG 和 MOV 文件的 Shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36379134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com