"/"를 표시하지 않고 파일을 찾는 방법

"/"를 표시하지 않고 파일을 찾는 방법

저는 초보자이고 Linux 스크립트 셸의 구문을 모릅니다.

(.sh)로 끝나는 완료된 파일만 표시해야 합니다.

하지만 (.sh)로 끝나는 파일의 경우, cut을 사용할 때 이름에 ".sh" 및 "./"가 표시되어서는 안 됩니다.

두 지점 사이의 모든 것을 가져갔습니다.

예: ./hello.sh

출력: /hello

슬래시가 여전히 남아 있고 해결책을 찾지 못했습니다. 예

답변1

이와 같이 찾기/잘라내기를 사용하면 하위 디렉터리의 모든 파일이 삭제됩니다. 현재 디렉터리에서 시도해 보세요 ls | cut -d"." -f1. 하위 디렉터리가 있으면 시도해 보세요.find * -name "*.sh" | sed "s/.sh$//"

새로운 조회를 사용하면 *현재 디렉터리의 모든 항목으로 확장되므로 그럴 수 있습니다(예 find file1.sh dir1 dir2 -name "*.sh": sed를 통해 파이핑, 끝 부분만 제거).

답변2

*.sh.sh접미사 없이 패턴과 일치하는 현재 디렉터리의 이름을 표시한다고 가정해 보겠습니다 .

for name in ./*.sh; do
    basename "$name" .sh
done

basename유틸리티는 첫 번째 인수로 주어진 경로명의 파일 이름 부분을 출력하고, 두 번째 인수가 주어지면 이름 끝에서 문자열이 제거됩니다. 위의 루프는 고려하지 않습니다숨겨진이름.

재귀적으로 수행해야 하는 경우 find다음과 같이 사용할 수 있습니다.

find . -name '*.sh' -exec basename {} .sh \;

이는 basename발견된 각 경로 이름을 호출하고 sh각 경로 이름에서 파일 이름 접미사를 제거합니다.

bash쉘을 사용하는 경우 다음을 수행할 수도 있습니다.

shopt -s nullglob dotglob
shopt -s globstar

for name in ./**/*.sh; do
    basename "$name" .sh
done

dotglob숨겨진 이름( )이 존재하는 경우 루프를 방지하기 위해 찾을 수 있도록 일부 쉘 옵션을 설정합니다.아니요일치( nullglob) 및 와일드카드 패턴을 사용하는 기능 **( globstar; "재귀적" 일치).

쉘을 사용하면 zsh다음과 같은 것을 얻을 수 있습니다

print -rC1 -- ./**/*.sh(DN:r:t)

... D어디서나N와일드카드 한정자끝에 있는 와일드카드 패턴은 파일 이름 접미사가 파일 이름( ~"root", 즉 접미사가 없는 이름의 루트) 에서 제거되고 경로 이름의 디렉터리 부분이 dotglobnullglob에서와 동일한 효과를 갖습니다 bash. 제거됨( ~"tail", 즉 이름의 끝 경로).:rr:tt

이름을 내림차순(이름 기준)으로 정렬하려면 zsh셸에서 다음을 사용할 수 있습니다.

print -rC1 -- ./**/*.sh(DNOn:r:t)

...추가된 부분은 On"이름의 역순"을 의미합니다.

상단 루프의 출력을 정렬하면 bash출력이 다음으로 전달됩니다 sort -r.

for name in ./*.sh; do
    basename "$name" .sh
done | sort -r

같은 find명령:

find . -name '*.sh' -exec basename {} .sh \; | sort -r

그러나 파일 이름에 개행 문자가 포함되어 있으면 이상한 결과가 나타날 수 있습니다.

관련 정보