명령줄을 사용하여 osx에서 임의의 파일 열기

명령줄을 사용하여 osx에서 임의의 파일 열기

터미널을 통해 무작위로 선택한 파일을 열고 싶습니다. 내가 필요한 유틸리티인 것 같은 을 찾았 shuf지만, 작업 중인 명령을 재귀적으로 만드는 방법을 찾을 수는 없습니다.

처음에는 를 사용했는데 open $(ls | gshuf -n1), 이는 플랫 디렉토리 구조가 있는 경우 매우 효과적이었습니다. 이것을 여러 하위 디렉터리로 반복하고 .DS_Store폴더와 같은 파일을 필터링하려면 어떻게 해야 합니까?

답변1

올바른 도구는 입니다 find. 재귀적으로 작동하므로 주요 문제가 해결됩니다. 방법을 알면 다양한 패턴을 제외할 수 있습니다.

기본 사용법은 다음과 같습니다.

open "$(find . -type f | shuf -n1)"

파일 이름에 줄 바꿈이 있으면 이 문제가 발생합니다. 귀하의 도구는 NUL 종료 데이터를 전달할 수 있는 비 POSIX 옵션을 지원할 수도 있고 지원하지 않을 수도 있습니다. 이 조각은 내 Debian에서 작동합니다.

find . -type f -print0 | shuf -z -n1

에 포함하더라도 $(…)후행 개행 문자(있는 경우)는 여전히 제거됩니다.

이름을 제외하려면 다음과 같은 구문을 사용할 수 있지만 ! -name .DS_Store전체 하위 디렉터리를 제외하려면 필요한-prune. 함정이 있습니다:

  • 피연산자의 순서는 중요합니다. 예를 들어 -prune디렉토리의 경우 앞에 와야 하며 /는 -type f일반적 으로 끝에 속합니다.-print-print0
  • 논리적 "또는"( -o)종종 괄호가 필요합니다그리고 그것은 당신이 원하는 만큼 직관적이지 않습니다.
  • -print/를 생략하면 -print0예상보다 더 많은 결과를 얻을 수 있습니다. 복잡한 논리의 경우 -print/ 를 명시적으로 포함하는 것이 좋습니다 -print0.

더 많은 것을 배우기 위해 공부하세요 man 1 find. 다음은 두 개의 디렉터리와 두 개의 이름 패턴을 제외하는 작업 예제입니다.

find . \( -name dir1 -o -name "dir 2" \) -prune -o -type f ! \( -name "*.txt" -o -name "echo*" \) -print

필요 $(…)하고 인용을 제대로 하라고 했으니, 안에 인용문은 $(…)따로 파싱된다는 점을 아셔야 합니다. 예를 들어 다음은 적절하게 인용되었습니다.

open "$(find . -type f ! -name "not this file" | shuf -n1)"

(비교하다이 답변, 특이한 2).

관련 정보