현재 작업 디렉토리의 모든 하위 디렉토리 이름을 나열하는 쉘 스크립트가 있습니다. 이름에 공백이 있는 디렉터리가 먼저 표시되고 그 뒤에 다른 디렉터리가 표시되도록 이름을 정렬하는 방법이 있습니까?
이것은 내 스크립트입니다.
#! /bin/bash
#search for files in a given directory
for file in $*
do
ls -1p | tr '/' ' '
done
이것이 생성하는 출력은 다음과 같습니다.
A7 Provided
a7q3.log
a7q4.log
A7 Starters
lsdir1.sh
lsdir.sh
다음과 같은 출력을 생성하는 방법이 있습니까?
A7 Provided
A7 Starters
a7q3.log
a7q4.log
lsdir1.sh
lsdir.sh
답변1
정렬 순서는 다음 요소에 따라 결정됩니다.LC_COLLATE
로케일 설정. 대부분의 언어는 사전과 같은 순서로 데이터 정렬을 설정합니다. 첫 번째 정렬은 대소문자를 구분하지 않으며 영숫자가 아닌 문자(예: 공백)를 무시합니다. 데이터 정렬을 C
코드 포인트별로 엄격하게 변경하여 공백이 인쇄 가능한 모든 문자 앞에 오고 모든 라틴 대문자가 다른 모든 문자 앞에 옵니다.
LC_COLLATE=C ls -1
또는
LC_ALL=C.utf8 ls -1
스크립트의 많은 내용이 의미가 없습니다(단어 목록 및 인수에 대한 확장 패턴 반복, 루프 본문에서 루프 변수를 사용하지 않고 반복, ls
줄 끝에 슬래시만 출력하는 방식으로 호출, 그런 다음 해당 슬래시를 공백으로 바꿉니다.) 무엇을 원하시는지 모르기 때문에 이 문제를 어떻게 해결해야 할지 말씀드릴 수는 없지만, 이것이 $*
되어야 하는 "$@"
경우 나, $*
말이 되는 경우는 거의 없다는 점은 말씀드릴 수 있습니다."$*"
$@
답변2
ls
공백이 있는 파일 이름(있는 경우)을 먼저 출력한 다음 공백이 없는 파일 이름을 출력하는 사용자 정의 함수를 원하십니까 ? 다음 함수는 bash의 extglob
쉘 옵션을 사용하여 와일드카드를 활성화합니다 !(* *)
. 이는 "공백 없이 모든 파일 이름으로 확장"을 의미합니다. 또한 쉘의 옵션이 변경되지 않도록 임시 하위 쉘(함수 본문에 중괄호 대신 괄호 사용)을 생성합니다.
function ls() (
command ls -1 *' '* 2>/dev/null
shopt -s extglob
command ls -1 !(* *) 2> /dev/null
)
물론 이름을 지정할 필요는 없습니다 ls
. (거의) 원하는 대로 이름을 지정할 수 있습니다.