2014-11-08 96 views
1

在目錄中與一羣看起來像這樣的文件的文件:獲取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 

這給我的任何文件。將!=更改爲==會爲我提供所有文件,而不僅僅是帶有下劃線的文件。 Other answers on SO表明這應該起作用。

我在這裏錯過了一些簡單的東西嗎?

+0

不解析find'的'輸出!這就是你想要的......使用球體(如anubhava的答案所示)。 – 2014-11-08 17:54:19

回答

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 0find因爲我的答案是對requiremnt :

我想只處理有.flv擴展和無下劃線

+1

絕對是最好的方法。你應該明確如何對這些文件進行循環。 – 2014-11-08 17:55:24

+0

哦,我忽略了OP中的'-mtime 0' ...這將更難以用globes實現... – 2014-11-08 17:57:46

+0

其實我不確定OP爲什麼使用'-mtime 0',因爲OP寫要求爲:* *我只想處理擴展名爲.flv且沒有下劃線的文件** – anubhava 2014-11-08 17:58:45

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

很好的答案。您應該向OP顯示如何對'find'(使用'-print0'和相應的'read')的結果執行循環,同時注意'-print0'不是POSIX。 – 2014-11-08 17:58:54

+0

@gniourf_gniourf我喜歡你的想法,但我不完全確定OP想要做什麼。我發現很多想循環的人實際上可以用'xargs'來代替 – Leon 2014-11-08 18:02:27

+1

然後顯示';)'這兩個選項'或者讓OP澄清他試圖達到的目標。 – 2014-11-08 18:04:59

1

的問題是這一行:

for f in "${FILES}" 

的報價是防止分詞,所以文件名的完整列表將被處理爲一個單一的項目。你想要的是:

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

IFS設置使得它使用換行符作爲分隔符字,所以你可以在他們空格的文件名。

一種更好的方式來寫循環這樣是爲了避免使用變量:

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

如果文件名包含通配符或方括號,則您需要進行路徑名擴展。所以你還應該在某處添加'set -f' ......這會變得有點笨重。 – 2014-11-08 18:08:59

+0

@gniourf_gniourf我已經添加了一個'find |而閱讀'循環顯示如何做到這一點,而不需要任何分詞。 – Barmar 2014-11-08 18:24:38