파일 및 디렉터리 목록이 포함된 텍스트 파일에 "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

관련 정보