답변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", 즉 접미사가 없는 이름의 루트) 에서 제거되고 경로 이름의 디렉터리 부분이 dotglob
셸 nullglob
에서와 동일한 효과를 갖습니다 bash
. 제거됨( ~"tail", 즉 이름의 끝 경로).:r
r
:t
t
이름을 내림차순(이름 기준)으로 정렬하려면 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
그러나 파일 이름에 개행 문자가 포함되어 있으면 이상한 결과가 나타날 수 있습니다.