在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
