ファイルとディレクトリのリストを含むテキストファイルで "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]

など。

答え1

cat file.txt | ls -lファイルの内容は次のように生成されます。標準入力of ls、そこでは何も読みません。通常、stdinは端末に接続されており、ls実行中は実際には何も入力しません。ただし、コマンドラインから読み取るので、コマンドの置き換えを使用してファイルの内容をそこに配置できます。

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

そこにあるので、-dディレクトリlsの内容はリストされません。

ただし、ここには単語の分割に関する一般的な注意事項があります。空白のある行は複数の部分に分割され、たとえば、などの名前のファイルがls検索されます。また、ファイル名のワイルドカード文字も拡張されます。これを防ぐには、ワイルドカードを無効にし、改行でのみ分割するように設定する必要があります。大きな打撃を受けたと仮定すると、次のようになります。packagedivertsothersset -fIFS

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

別のアプローチは、シェルのファイルの内容を繰り返し、その行がディレクトリ名を表すかどうかをテストすることです。

答え2

ls私は出力の前に許可文字列を解析する代わりにこれを行う必要があると思いました。

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

必要に応じてこのフォームを使用できます[ -f "$filepath" ]test

関連情報