'ls -1' : 확장자 없이 파일 이름을 나열하는 방법

'ls -1' : 확장자 없이 파일 이름을 나열하는 방법

ls -1내 요소를 다음과 같이 나열하십시오.

foo.png
bar.png
foobar.png
...

다음과 같은 항목 없이 나열되기를 원합니다 .png.

foo
bar
foobar
...

(이 디렉토리에는 .png파일만 포함되어 있습니다)

grep이 경우에 누군가 그것을 사용하는 방법을 말해 줄 수 있습니까?

목적: 모든 이름을 나열하지만 확장자는 나열하지 않은 텍스트 파일이 있습니다. 어떤 파일이 누락되었는지 확인하기 위해 텍스트 파일을 폴더와 비교하는 스크립트를 만들고 싶습니다.

답변1

ls -1 | sed -e 's/\.png$//'

이 명령은 다음 을 sed제거(즉, 빈 문자열로 대체)합니다..png파일 이름.

정규식 (모든 문자와 일치함을 의미) 이 아닌 리터럴 문자 로 해석되도록 .이스케이프 합니다 . 줄 끝 앵커이므로 파일 이름 중간과 일치하지 않습니다.\.sed..$.png

답변2

필요한 것은 작업을 수행하는 데 필요한 쉘뿐입니다.

POSIX적으로:

for f in *.png; do
    printf '%s\n' "${f%.png}"
done

그리고 zsh:

print -rl -- *.png(:r)

답변3

Bash만 사용하고 싶다면:

for i in *; do echo "${i%.png}"; done

grep일치하는 항목을 찾으려면 삭제/교체하는 대신 sed더 적합한 항목에 접근해야 합니다.

find . -maxdepth 1 -name "*.png"  | sed 's/\.png$//'

PNG 파일의 순서를 조정하기 위해 일부 하위 디렉터리를 만들어야 한다고 결정한 후에는 쉽게 다음과 같이 변경할 수 있습니다.

find . -name "*.png"  | sed 's/\.png$//'

답변4

매우 유사한 또 다른 답변은 다음과 같습니다(이 특정 변형이 아직 나타나지 않았다는 사실에 놀랐습니다).

ls | sed -n 's/\.png$//p'
  • 표준 출력은 터미널(이 경우 파이프)이 아닌 것으로 가정되므로 옵션 -1이 필요하지 않습니다 .lsls
  • 옵션은 "기본적으로 이 줄을 인쇄하지 않음"을 -n의미합니다 .sed
  • /p대체 끝에 있는 옵션은 "...대체가 이루어지면 이 줄을 인쇄하십시오"를 의미합니다.

최종 효과는 으로 끝나는 줄만 인쇄 .png하고 삭제하는 것 입니다 .png. 즉, 이는 디렉토리에 파일 이상의 내용이 포함되어 있는 OP 질문의 약간의 일반화도 만족시킵니다 .png.

sed -n이 기술은 grep+sed를 사용할 수 있는 상황에서 종종 유용합니다.

관련 정보