在bash脚本中获取包含下划线的文件

在一个包含如下所示的一堆文件的目录中:

./test1_November 08, 2014 AM.flv
./test2.flv
./script1.sh
./script2.sh

我只想处理扩展名为.flv且没有下划线的文件。 我试图用下划线消除没有太多运气的文件。

bash --version
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)

脚本:

#!/bin/bash

FILES=$(find . -mtime 0) 
for f in "${FILES}"
do
        if [[ "$f" != *_* ]]; then
                echo "$f"
        fi
done

这给了我没有文件。 将!=更改为==会为我提供所有文件,而不仅仅是带有下划线的文件。 SO上的其他答案表明这应该起作用。

我在这里错过简单的东西吗?


你可以使用这个扩展的glob模式:

shopt -s extglob
echo +([^_]).flv

+([^_])将匹配任何非下划线字符中的一个或多个。

测试:

ls -l *flv
-rw-r--r-- 1 user1 staff 0 Nov  8 12:44 test1_November 08, 2014 AM.flv
-rw-r--r-- 1 user1 staff 0 Nov  8 12:44 test2.flv

echo +([^_]).flv
test2.flv

要在循环中处理这些文件,请使用:

for f in +([^_]).flv; do
   echo "Processing: $f"
done

PS:不知道你在find使用-mtime 0 ,因为我的答案是requiremnt:

我只想处理扩展名为.flv且没有下划线的文件


您可以传递多种模式来find并包含一个不是

find . -name "*.flv" -not -name "*_*"

您可以通过管道输入一段while来循环find结果

find -name "*.flv" -not -name "*_*" -print0 | while IFS= read -r -d '' filename; do
    echo "$filename"
done

或者你可以完全放弃循环并使用xargs

find -name "*.flv" -not -name "*_*" -print0 | xargs -0 -n1 echo

问题是这条线:

for f in "${FILES}"

引号是防止分词,所以文件名的整个列表正在处理为一个单一的项目。 你想要的是:

IFS=$'n'
for f in $FILES

IFS设置使用换行符作为分隔符,因此您可以在文件名中包含空格。

像这样编写循环的更好方法是避免使用变量:

find ... | while read -r f
do
    ...
done
链接地址: http://www.djcxy.com/p/36209.html

上一篇: Get files in bash script that contain an underscore

下一篇: check two conditions in if statement in bash