我有一个名为“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
有道理;假定文件比目录列表小。 –