2016-08-14 92 views

回答

1
$ ls -1 tmp 
abc def 
bar 
foo 

$ cat file 
stuff 
abc def 
bar 
nonsense 
foo 

$ xargs -d'\n' -I {} -n 1 < file ls tmp/{} 2>/dev/null 
tmp/abc def 
tmp/bar 
tmp/foo 
2

你可以使用這個while循環:

while IFS= read -r line; do 
    f="dir/$line" 
    [[ -f $f ]] && printf "%s\n" "$f" 
done < my_text_file.txt 

或者使用xargs的,你可以這樣做:

xargs -0 ls -ld 2>/dev/null < <(awk -v ORS='\0' '{print ".foo/"$0}' my_text_file.txt) 
+0

O.O - 我覺得有點太多了? –

+1

而不是循環目錄中所有文件的可能大集合,這是更好地循環通過文本文件中的文件,並避免grep。 – anubhava

+1

有道理;假定文件比目錄列表小。 –

1

你需要傳遞oh到grep:

$ ls 
1.txt 2.txt 3.txt files.txt 

$ cat files.txt 
1.txt 
2.txt 
3.txt 
hello.txt 

$ for n in *; do grep -oh $n files.txt; done 
1.txt 
2.txt 
3.txt 
+0

對於名稱包含空格和/或通配符和/或正則表達式元字符和/或名稱與其他文件部分匹配的文件(1.txt將匹配11.txt)的文件,將會失敗 –

1

你沒有說你正在使用哪個外殼。如果你有bashzsh,您可以使用

comm -12 <(ls dir) <(sort my_text_file.txt) 

這是否也與其他貝殼也一樣,我不知道。

相關問題