
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
옵션이 필요하지 않습니다 .ls
ls
- 옵션은
-n
'sed
기본적으로 해당 줄을 인쇄하지 않음'을 의미합니다. /p
대체 끝에 있는 옵션은 '...대체가 이루어진 경우 이 줄을 인쇄합니다'를 의미합니다 .
.png
그 결과 로 끝나는 줄만 제거 되고 로 끝나는 줄만 인쇄됩니다 .png
. 즉, 이는 디렉토리에 파일만 포함되지 않는 OP 질문의 약간의 일반화에도 적합합니다 .png
.
이 sed -n
기술은 grep+sed를 사용할 수 있는 경우에 종종 유용합니다.