在包含大量文件的目录中:
./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表明这应该有用。
我在这里错过了一些简单的东西吗?
答案 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