我有一個名爲「my_text_file.txt」的文本文件。我有另一個名爲「dir」的目錄。我只得到一個文本文件中包含另一個目錄中的文件的文件名的行
現在,「my_text_file.txt」有幾行,每行都有一個文件名。我只想得到「my_text_file.txt」的那些文件名也出現在目錄「dir」中的行。
我想是這樣
ls dir -1 | grep my_text_file.txt
但似乎並沒有工作。任何幫助表示讚賞。
我有一個名爲「my_text_file.txt」的文本文件。我有另一個名爲「dir」的目錄。我只得到一個文本文件中包含另一個目錄中的文件的文件名的行
現在,「my_text_file.txt」有幾行,每行都有一個文件名。我只想得到「my_text_file.txt」的那些文件名也出現在目錄「dir」中的行。
我想是這樣
ls dir -1 | grep my_text_file.txt
但似乎並沒有工作。任何幫助表示讚賞。
$ 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
你可以使用這個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)
你需要傳遞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
對於名稱包含空格和/或通配符和/或正則表達式元字符和/或名稱與其他文件部分匹配的文件(1.txt將匹配11.txt)的文件,將會失敗 –
你沒有說你正在使用哪個外殼。如果你有bash
或zsh
,您可以使用
comm -12 <(ls dir) <(sort my_text_file.txt)
這是否也與其他貝殼也一樣,我不知道。
O.O - 我覺得有點太多了? –
而不是循環目錄中所有文件的可能大集合,這是更好地循環通過文本文件中的文件,並避免grep。 – anubhava
有道理;假定文件比目錄列表小。 –