想知道是否有人可以用正则表达式和bash来帮助我。
我正在尝试对只有特定扩展名的文件执行一组命令,在这种情况下:mpg,mpeg,avi和mkv。
我实际上在这里找到了一个解决方案,然而,它似乎不起作用。如果有人能告诉我原因,我会很感激。
#!/bin/bash
# Configuration
TARGETDIR="$1"
TARGETEXT="(mpg|mpeg|avi|mkv)"
for d in `find $1 -type d`
do
echo "Searching directory: $d"
for f in "$d"/*
do
if [ -d "${f}" ];
then
# File is a directory, do not perform
echo "$f is a directory, not performing ..."
elif [ -f "${f}" ];
then
filename=$(basename "$f")
extension="${filename##*.}"
if [ "$extension" == "$TARGETEXT" ];
then
echo "Match"
else
echo "Mismatch - $f - $extension"
fi
fi
done
done
再次,感谢任何帮助。
答案 0 :(得分:6)
这可以仅使用find
命令来完成。
find $TARGETDIR -regex ".*\\.$TARGETEXT" -type f -exec your_command {} \;
答案 1 :(得分:1)
而不是直接字符串比较
if [ "$extension" == "$TARGETEXT" ];
使用Bash正则表达式匹配语法
if [[ "$extension" =~ $TARGETEXT ]];
请注意double [[]]和未引用的$ TARGETEXT。
答案 2 :(得分:0)
你可以在没有正则表达式的bash中执行此操作,只需文件模式:
shopt -s globstar nullglob
for f in **/*.{mpg,mpeg,avi,mkv}; do
if [[ -f "$f" ]]; then
# do something with the file:
echo "$f"
fi
done