나는 ls ?[0-9]*
이것을 시도했고 이것은 현재 디렉터리의 모든 파일과 일치하지만 현재 디렉터리의 모든 디렉터리를 확장하고 모든 하위 디렉터리의 파일과 일치합니다. *가 현재 디렉터리에만 일치하도록 하고 싶습니다.
---- Program output --------------------------------
f1
f2
g2t
g3t
d2:
d4:
--- Expected output (text)---
d2
d4
f1
f2
g2t
g3t
여기서 d2와 d4는 디렉터리이고 나머지는 파일입니다. d2: 및 d4가 아닌 d2 및 d4로 나열되기를 원합니다.
답변1
?[0-9]*
오직이름으로 확장현재의두 번째 문자가 숫자인 디렉터리입니다. ls
, 디렉토리 이름을 얻을 때 해당 디렉토리의 내용이 분명히 표시됩니다. 즉, ls
이 작업을 수행하지 않도록 지시해야 함을 의미합니다.
다음을 사용하여 이 작업을 수행할 수 있습니다 ls -d
.
ls -d -- ?[0-9]*
또는
ls -d ./?[0-9]*
--
파일 이름이 대시로 시작하면 파일 이름의 첫 번째 문자를 옵션으로 해석 하지 ./
않습니다 .ls
디렉터리가 아닌 항목에만 관심이 있고 디렉터리의 심볼릭 링크도 지우고 싶은 경우 이를 수행하는 두 가지 확실한 방법이 있습니다.
쉘 루프를 사용하여 각 이름을 테스트하여 디렉터리인지 확인하고 그렇지 않은 경우 이름을 표시합니다.
for name in ?[0-9]*; do [ ! -d "$name" ] && printf '%s\n' "$name" done
점으로 시작하는 파일(숨겨진 파일)을 포함하기 위해 쉘에는
dotglob
루프(shopt -s dotglob
inbash
) 전에 설정할 수 있는 쉘 옵션이 있을 수 있습니다.find
현재 디렉터리에서 디렉터리가 아닌 항목을 찾는 데 사용됩니다 (그리고 디렉터리에 대한 심볼릭 링크를 지웁니다).find -L . -maxdepth 1 ! -type d -name '?[0-9]*'
-L
make 옵션은find
모든-type d
기호 링크의 대상을 참조합니다(현재 경로 이름이 기호 링크인 경우).
답변2
정규식을 사용하여 다음과 같이 ls를 egrep으로 파이프할 수 있습니다.
ls | egrep '.\d.*'