파일과 디렉터리 목록이 포함된 텍스트 파일이 있는데 파일만 필터링하고 싶습니다. 나는 이것을 시도했지만 성공하지 못했습니다 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
검색됩니다 . 또한 파일 이름의 와일드카드 문자가 확장됩니다. 이를 방지하려면 와일드카드를 비활성화 하고 줄 바꿈에서만 분할하도록 설정해야 합니다. 큰 타격을 받았다고 가정하면 다음과 같습니다.package
diverts
others
set -f
IFS
(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