2014-12-13 48 views
0

dupes.txt包含沒有擴展名的文件字符串列表(通過比較沒有擴展名的基本名稱找到)。我能得到這個呼應線:如何傳遞變量來查找名稱選項?

files=`cat dupes.txt`; for f in "$files"; do echo "$f"; done 

我試圖再通過「$ F」到find命令的名稱選項

files=`cat dupes.txt`; for f in "$files"; do find . -type f -name "$f"; done 

但什麼都不會返回。建議最受歡迎。換句話說,我想找到與文本文件中的模式匹配的所有文件。

我已經試過

find . -type f | fgrep -f dupes.txt 

但這並不限制查找的輸出到那些匹配dupes.txt文件字符串的文件。

順便說一句,我正在OS X上的bash shell中工作。

回答

0

試試這個:

files=$(cat dupes.txt) 
for f in $files; do find . -type f -name "${f}*"; done 
+0

換句話說,你需要指定在 -name參數通配符。 – 2014-12-13 18:28:50

+0

而不是引用$文件來利用分詞 – 2014-12-13 18:30:19

+0

而不引用'$ files'將使代碼受到路徑名擴展的影響。 – 2014-12-13 19:02:54

3

這是錯誤的:

files=`cat dupes.txt`; for f in "$files"; do echo "$f"; done 

因爲你引用"$files",外殼有沒有機會變分裂的空白。因此,在循環"$f"內將包含文件的全部內容。

遍歷一個文件的內容,選擇

while IFS= read -r f; do ...; done < dupes.txt 
# or 
mapfile -t files < dupes.txt; for f in "${files[@]}"; do ...; done 

一個下面是創建的圖案複雜的方式,但你只需要調用find一次,這是一個巨大的勝利:

find_args=() 
while IFS= read -r file; do 
    find_args+=(-o -name "${file}*") 
done < dupes.txt 
find . -type f \("${find_args[@]:1}" \) 
+0

謝謝,Glenn。我會試試這個。當然,我不想多打一次電話。 (我正在嘗試'讀線'腳本,並注意到這一點)。 – sqldoug 2014-12-14 00:38:07

0
while read i; do 
    find -type f -name "${i}*" 
done < dupes.txt 
+0

括號是不必要的; while循環本身可以接受輸入重定向。 – chepner 2014-12-13 22:55:26

+0

已刪除,10x @chepner – 2014-12-13 22:59:46

+0

謝謝;有太多要學習! – sqldoug 2014-12-14 02:46:33