我可以在包含文件和目录列表的文本文件上运行“ls”吗?

我可以在包含文件和目录列表的文本文件上运行“ls”吗?

我有一个包含文件和目录列表的文本文件,我只想过滤文件。我尝试了这个,但没有成功:cat file.txt | ls -l | grep ^-。这是文件:

/etc
/etc/firefox-esr
/etc/firefox-esr/firefox-esr.js
/usr
/usr/bin
/usr/bin/firefox
package diverts others to: /usr/bin/firefox.real
/usr/lib
/usr/lib/firefox-esr
/usr/lib/firefox-esr/Throbber-small.gif
/usr/lib/firefox-esr/application.ini
/usr/lib/firefox-esr/browser
/usr/lib/firefox-esr/browser/blocklist.xml
/usr/lib/firefox-esr/browser/chrome.manifest
/usr/lib/firefox-esr/browser/crashreporter-override.ini
/usr/lib/firefox-esr/browser/features
/usr/lib/firefox-esr/browser/features/[email protected]
/usr/lib/firefox-esr/browser/features/[email protected]
/usr/lib/firefox-esr/browser/features/[email protected]
/usr/lib/firefox-esr/browser/features/[email protected]
/usr/lib/firefox-esr/browser/features/[email protected]

ETC。

答案1

cat file.txt | ls -l会将文件的内容生成到标准输入of ls,它只是不从那里读取任何内容。通常 stdin 连接到终端,并且ls在它运行时您永远不会真正键入任何内容。不过它确实从命令行读取,因此您可以通过命令替换将文件的内容放在那里:

ls -ld $(cat file.txt) | grep ^-

-d那里,所以ls不会列出目录的内容。

然而,这里有一个关于分词的常见警告,带有空格的行将被分成多个部分,并且ls例如会查找名为 packagediverts和的文件others。此外,文件名中的通配符也会被扩展。为了防止这种情况,我们需要禁用通配符set -f并设置IFS为仅在换行符上拆分。假设重击:

(set -f; IFS=$'\n'; ls -ld $(cat file.txt) | grep ^- )

另一种方法是在 shell 中循环文件内容并测试这些行是否代表目录名称。

答案2

ls我想我应该这样做,而不是尝试解析输出前面的权限字符串:

while IFS= read -r filepath; do 
  test -f "$filepath" && echo "$filepath: is an ordinary file"
done < file.txt

如果您愿意,可以使用[ -f "$filepath" ]的形式。test

相关内容