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

时间:2014-11-08 17:41:52

标签: linux bash debian

在包含大量文件的目录中:

./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

这给了我没有文件。将!=更改为==会为我提供所有文件,而不仅仅是带有下划线的文件。 Other answers on SO表明这应该有用。

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

3 个答案:

答案 0 :(得分:4)

您可以使用此扩展的glob模式:

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

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

<强>测试

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:不确定您是否在-mtime 0中使用find,因为我的答案是针对要求的:

  

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

答案 1 :(得分:4)

您可以将多个模式传递给find并包含不是

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

您可以将find

中的while

传递给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

{{1}}

答案 2 :(得分:1)

问题在于这一行:

for f in "${FILES}"

引号阻止了单词拆分,因此整个文件名列表正在作为单个项目处理。你想要的是:

IFS=$'\n'
for f in $FILES

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

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

find ... | while read -r f
do
    ...
done