'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를 사용할 수 있는 경우에 종종 유용합니다.

관련 정보