在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