Ls

我可以在包含文件和目錄列表的文本文件上執行“ls”嗎?

  • February 9, 2020

我有一個包含文件和目錄列表的文本文件,我只想過濾文件。我試過這個,但沒有奏效: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/formautofill@mozilla.org.xpi
/usr/lib/firefox-esr/browser/features/fxmonitor@mozilla.org.xpi
/usr/lib/firefox-esr/browser/features/screenshots@mozilla.org.xpi
/usr/lib/firefox-esr/browser/features/webcompat-reporter@mozilla.org.xpi
/usr/lib/firefox-esr/browser/features/webcompat@mozilla.org.xpi

等等

cat file.txt | ls -l會將文件的內容生成到 的標準輸入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 中的文件內容並測試這些行是否代表目錄名稱。

引用自:https://unix.stackexchange.com/questions/566663