"ls"가 출력을 정렬하는 것을 방지하는 방법은 무엇입니까?

"ls"가 출력을 정렬하는 것을 방지하는 방법은 무엇입니까?

약 40개의 파일이 존재한다면 나열하고 싶은 특정 파일 순서가 있습니다. 일종의 우선순위. 그래서 나는 다음을 시도한다:

ls -1d         /opt/foo/lib.jar /opt/bar/lib.jar

/opt/foo/lib.jar둘 다 존재한다면 이것이 먼저 나열될 것으로 기대합니다. 그러나 실제로는 bar첫 번째 항목과 foo그 뒤에 오는 항목을 인쇄합니다.

ls매개변수에 지정된 순서대로 항목을 나열하는 방법이 있습니까 ?
아니면 다른 대안이 있나요 find?

답변1

GNU를 사용하면 ls다음 -U옵션을 시도해 볼 수 있습니다.

-U: 정렬하지 않고 항목을 디렉토리 순서로 나열합니다.

(그러나 여기서는 디렉토리의 내용을 나열하지 않으므로 중요한 부분은 다음과 같습니다.정렬되지 않음).

$ ls -1dU /opt/foo/lib.jar /opt/bar/lib.jar
/opt/foo/lib.jar
/opt/bar/lib.jar

약간 더 이식성이 높으며(GNU 및 FreeBSD에서는 작동 ls하지만 레거시 ls구현이나 POSIX에서는 작동하지 않음) 다음을 사용할 수 있습니다 ls -1df.

$ ls -1df /opt/foo/lib.jar /opt/bar/lib.jar
/opt/foo/lib.jar
/opt/bar/lib.jar

답변2

언급한 후에 find경로 매개변수로 여러 경로를 사용할 수 있다는 것을 알았습니다. 그래서 간단합니다.

 find /opt/foo/lib.jar /opt/bar/lib.jar -prune 2> /dev/null

답변3

lsls각 인수를 호출하여 인수(주어진 순서대로)를 반복하는 래퍼 함수를 ​​만들 수 있습니다 .

myls() {
  for arg do
    ls -d -- "$arg"
  done
}

Stéphane의 답변을 참조하세요.for 루프에서 $1 $2...와 같은 매개변수를 사용하는 방법은 무엇입니까?문법 용 for arg do.

답변4

존재 여부를 확인하고 테스트하려는 경로 이름 목록이 있는 경우 존재하는 경로 이름, 존재하지 않는 경로 이름 또는 두 경로 이름 집합을 사용하여 작업을 수행한다고 가정합니다.

표준 쉘이 주어지면 이는 루프에서 수행되는 것이 가장 좋습니다.

for pathname in /the/first/path /the/second/path /some/other/path
do
    if [ -e "$pathname" ]; then
        printf 'Path "%s" exists\n' "$pathname"
    else
        printf 'Path "%s" does not exist\n' "$pathname"
    fi
done

관련 정보