Mac 단축어를 사용해 텍스트를 셸 스크립트로 전달하면, 지정한 로컬 폴더에서 가장 최근에 수정된 텍스트 파일을 선택해 항목을 추가할 수 있습니다. 이 안내에서는 테스트용 임시 파일을 사용하며, 폴더가 비어 있거나 가장 최신 수정 시간이 같은 파일이 있으면 작업을 중단합니다.

여기서 다루는 작업은 구체적입니다. 매번 파일을 직접 선택하지 않고 기존 일반 텍스트 파일에 짧은 항목을 추가하는 것입니다. Apple은 Mac 단축어에서 셸 스크립트를 지원한다고 안내합니다. 아래 워크플로는 이 지원 기능과 문서화된 zsh 파일 선택 및 추가 동작을 결합합니다. macOS용 단축어 알아보기

‘가장 최근 파일’의 의미 정하기

이 글에서는 가장 최근 파일을 가장 최근에 수정된 파일로 정의합니다. 스크립트는 지정된 폴더 바로 안에 있는, 이름이 소문자 .txt로 끝나는 숨김이 아닌 일반 파일만 대상으로 합니다. 하위 폴더와 심볼릭 링크는 제외합니다. 이러한 선택 규칙은 zsh의 파일명 패턴과 한정자에 따른 것입니다. 확장

이 정의는 여러 번 실행할 때 영향을 줍니다. 파일에 텍스트를 추가하면 수정 시간이 바뀌므로, 대체로 그 파일이 선택 가능한 파일 중 가장 최근 파일로 남습니다. 새로 생성된 최신 문서를 따르려는 것이라면 수정 시간과 생성 시간은 다른 기준입니다. 이 워크플로가 생성일 기준으로 파일을 선택한다고 가정하지 마세요.

단축어를 만들기 전에 작업에 맞는 규칙을 선택하세요.

의도한 작업 이 예제가 맞나요?
가장 최근에 편집한 .txt 파일에 추가 예
이름에 날짜가 가장 최신으로 표시된 파일에 추가 아니요. 파일 이름을 날짜로 해석하지 않습니다
가장 최근에 생성된 파일에 추가 아니요. 생성 시간은 사용하지 않습니다
하위 폴더의 파일도 포함 아니요. 한 폴더 안으로 선택을 제한합니다
서식 있는 텍스트 문서나 PDF에 추가 아니요. 이 예제는 일반 텍스트를 씁니다

Finder는 시각적으로 확인하는 데 유용합니다. 폴더를 목록 보기로 열고 수정한 날짜 열 제목을 클릭하세요. 최신 항목을 맨 위에 표시하려면 필요에 따라 다시 클릭합니다. Apple은 열을 기준으로 정렬하고 순서를 뒤집는 방법을 모두 안내합니다. Finder 화면을 통해 결과를 확인할 수 있지만, 스크립트는 자체적으로 파일을 선택합니다. Mac의 Finder에서 항목 정렬 및 배열하기

임시 예제 폴더 만들기

이 예제에서는 홈 폴더 안에 Shortcut Append Demo라는 폴더를 사용합니다. 설정은 같은 이름의 폴더가 이미 있으면 내용을 재사용하지 않고 의도적으로 중단합니다. 테스트용 텍스트 파일 두 개를 만들고, 두 번째 파일의 수정 시간이 더 늦도록 2초 간격을 둡니다.

터미널을 열고 아래 설정 블록 전체를 붙여 넣은 다음 Return 키를 누르세요. 따옴표로 묶인 heredoc은 별도의 zsh 프로세스에서 명령을 실행하므로, 설정이 실패하면 해당 프로세스가 종료됩니다.

/bin/zsh <<'ZSH'
emulate -L zsh
setopt ERR_EXIT
folder="$HOME/Shortcut Append Demo"

if ! /bin/mkdir "$folder"; then
  printf '%s\n' 'Setup stopped: use a new folder name if this one exists.' >&2
  exit 1
fi

printf '%s\n' 'Sample entry: blue notebook.' > "$folder/older.txt"
/bin/sleep 2
printf '%s\n' 'Sample entry: green notebook.' > "$folder/newer.txt"
printf 'Example folder: %s\n' "$folder"
ZSH

설정은 새 폴더 생성이 성공한 뒤에만 출력 리디렉션으로 파일을 만듭니다. Apple은 명령 출력을 파일에 쓰는 일반 출력 리디렉션과 파일 끝에 출력을 덧붙이는 추가 리디렉션을 구분해 설명합니다. Mac에서 터미널 입력 및 출력 리디렉션하기

설정에서 폴더가 이미 있다고 보고하면 다른 임시 이름을 선택하고, 설정과 아래 단축어 스크립트 모두에서 폴더 할당 부분을 바꾸세요. 기존 폴더에 개별 파일 작성 줄만 다시 실행하지 마세요.

단축어 만들기 및 텍스트 입력 유지하기

단축어 앱에서 새 단축어를 만들고 Append to Newest Text File이라고 이름을 지정하세요. 동작 검색을 사용해 아래 동작을 추가합니다. Apple은 동작 라이브러리 검색 방법과 정보 보기를 통해 각 동작이 받는 입력 및 생성하는 출력을 확인하는 방법을 안내합니다. Mac의 단축어에서 동작 목록 탐색하기

  1. 텍스트 동작을 추가하고 테스트 항목 Sample entry: orange notebook.을 입력합니다.
  2. 바로 다음에 셸 스크립트 실행을 추가합니다.
  3. 셸을 /bin/zsh로 설정합니다.
  4. 스크립트의 입력을 앞서 추가한 텍스트 동작의 출력으로 설정합니다.
  5. 입력 전달을 인수로로 설정합니다.
  6. 다음 섹션의 전체 스크립트로 스크립트 필드를 바꿉니다.

의도한 연결은 텍스트 값 하나를 스크립트 인수 하나로 전달하는 것입니다. 스크립트는 해당 인수를 $1로 읽습니다. 성공하면 대상 경로를 포함한 텍스트 확인 메시지가 출력됩니다. 이 경로는 단축어의 파일 객체가 아니며, 출력은 파일의 전체 내용도 아닙니다.

입력은 텍스트 출력에 연결된 상태로 두세요. 파일이나 파일 이름 목록, 또는 단축어의 관련 없는 입력을 전달하면 스크립트에 도착하는 값이 달라집니다. 스크립트는 인수 개수를 확인하므로, 예상치 못한 입력 모음이 여러 항목으로 추가되는 일을 방지합니다.

스크립트가 비활성화되어 있다면 단축어 > 설정을 열고 고급을 선택한 다음 스크립트 실행 허용을 켜세요. 이는 단축어에서 스크립트를 허용하는 Apple 문서에 안내된 설정입니다. Apple의 스크립트 설정 안내

파일을 선택하고 내용을 추가하는 스크립트

아래 프로그램 전체를 셸 스크립트 실행에 붙여 넣으세요. 다운로드 도구나 별도의 스크립트 파일은 필요하지 않습니다. 폴더 할당은 위에서 만든 임시 폴더와 일치합니다.

emulate -L zsh
unsetopt CLOBBER APPEND_CREATE

fail() {
  printf '%s\n' "$1" >&2
  exit 1
}

(( $# == 1 )) || fail 'Expected exactly one text input.'
[[ -n "$1" ]] || fail 'The text input is empty.'

folder="$HOME/Shortcut Append Demo"
[[ -d "$folder" ]] || fail 'The example folder does not exist.'

files=( "$folder"/*.txt(N.om) )
(( ${#files} > 0 )) || fail 'No eligible .txt files were found.'

newest="${files[1]}"

if (( ${#files} > 1 )); then
  [[ "$newest" -nt "${files[2]}" ]] ||
    fail 'The newest timestamp is tied or the folder changed. Check the files.'
fi

[[ -f "$newest" && ! -L "$newest" ]] ||
  fail 'The selected file is no longer an eligible regular file.'
[[ -w "$newest" ]] || fail 'The selected file is not writable.'

if ! printf '\n%s\n' "$1" >> "$newest"; then
  fail 'Append failed; inspect the selected file before retrying.'
fi

printf 'Appended to: %s\n' "$newest"

선택 표현식은 일치하는 파일 경로를 배열로 만듭니다. (N.om)에서 N은 일치 항목이 없어도 허용하고, .는 일반 파일로 범위를 제한하며, om은 수정 시간을 기준으로 정렬해 가장 최근 파일을 맨 앞에 둡니다. 경로를 배열에 보관하면 파일 이름의 공백 때문에 경로가 잘리는 일을 방지할 수 있습니다. 확장

다음 검사는 첫 번째 파일이 두 번째 파일보다 반드시 더 최근에 수정되었는지 확인합니다. 수정 시간이 같으면 단축어는 하나를 임의로 선택하지 않고 중단합니다. zsh 문서에는 파일의 최신 여부를 비교하는 -nt와 여기서 사용하는 일반 파일, 심볼릭 링크, 쓰기 가능 파일 검사 방법이 설명되어 있습니다. 조건식

추가 명령은 고정된 printf 형식을 사용하고 입력 항목을 %s 인수로 전달합니다. 따라서 항목에 포함된 퍼센트 기호와 백슬래시는 추가 서식 지시문이 아니라 텍스트로 처리됩니다. 앞쪽의 줄바꿈은 기존 텍스트와 항목을 구분하고, 마지막 줄바꿈은 항목을 끝냅니다. 파일이 이미 줄바꿈으로 끝나는 경우 항목 사이에 빈 줄이 생깁니다. 셸 내장 명령

스크립트는 CLOBBER과 APPEND_CREATE도 해제합니다. 두 옵션을 모두 해제하면 대상이 존재하지 않을 때 추가 리디렉션이 실패한다고 zsh 문서에 명시되어 있습니다. 선택한 파일이 추가 작업 전에 사라진 경우에도 스크립트가 기존 경로에 새 파일을 만들지 않고 오류를 보고해야 하므로 중요합니다. 리디렉션

예제 파일로 결과 확인하기

단축어를 한 번 실행하세요. 샘플 폴더를 변경하지 않았다면 예상 대상은 newer.txt입니다. 해당 파일을 열어 아래 내용이 있는지 확인하세요. 이는 예제에서 예상되는 결과이며, Mac UI 테스트를 완료했다는 뜻은 아닙니다.

Sample entry: green notebook.

Sample entry: orange notebook.

older.txt도 여세요. 파일에는 여전히 Sample entry: blue notebook.만 있어야 합니다. 두 파일을 모두 확인하면 대상 하나를 선택하고 다른 파일은 그대로 유지하는 두 가지 동작을 검증할 수 있습니다.

텍스트 동작을 Sample entry: yellow notebook.으로 바꾸고 다시 실행해 두 번째 테스트 항목을 추가해 보세요. 다른 적격 파일의 수정 시간이 더 최근으로 바뀌지 않았다면 newer.txt에 구분된 항목이 하나 더 추가되어야 합니다. 같은 입력으로 단축어를 두 번 실행하면 해당 입력이 두 번 추가됩니다. 이 프로그램은 중복 항목을 감지하지 않습니다.

이 예제들은 문서와 대조해 검토했지만 여기서 실행하지는 않았습니다. 현재 환경에는 macOS 단축어와 zsh가 모두 없습니다. 폴더 할당을 변경하기 전에 Mac에서 임시 파일을 사용해 확인을 마치세요.

빈 폴더, 이름 충돌, 파일 변경 이해하기

이 워크플로에는 기존 대상이 필요합니다. 폴더가 없거나 비어 있거나 적격 항목이 하나도 없으면 추가 전에 오류가 발생합니다. 기본 파일을 만들거나, 하위 폴더를 선택하거나, 이름이 다른 문서로 대체하지 않습니다.

대상을 새로 만들지 않아 이름 충돌을 방지합니다. 설정은 폴더 이름이 이미 있으면 중단됩니다. 일반적인 단축어 실행에서는 선택한 파일의 이름을 그대로 유지하며, 스크립트는 파일 이름을 바꾸거나 사본을 따로 저장하지 않습니다. 파일이 사라졌을 때의 동작은 문서화된 zsh 추가 옵션으로 제어합니다. 리디렉션

결과가 예상과 다를 때는 다음 순서로 확인하세요.

  1. 폴더 할당을 확인하세요. 설정 중 만든 폴더와 일치해야 합니다.
  2. 적격 여부를 확인하세요. 샘플 패턴은 폴더 최상위에 있는 숨김이 아닌 일반 파일 중 이름이 소문자 .txt로 끝나는 파일을 포함합니다.
  3. 수정 시간 순서를 확인하세요. Finder에서 수정한 날짜를 확인하세요. 파일을 편집하면 다음 대상이 될 수 있습니다.
  4. 수정 시간이 같은지 확인하세요. 의도한 샘플 파일을 편집하고 나중에 저장한 뒤 순서를 다시 확인하세요.
  5. 동작 연결을 확인하세요. 텍스트 값 하나가 인수 하나로 셸에 전달되어야 합니다.

이 스크립트는 실행 중 폴더가 변경되지 않는다는 전제에서 설계되었습니다. 선택과 쓰기는 별도의 작업이므로, 다른 프로세스가 그 사이에 파일을 편집, 교체하거나 추가할 수 있습니다. 검사 절차가 이 워크플로를 트랜잭션으로 바꾸지는 않으며, 쓰기 실패 시 항목 일부만 추가될 수 있습니다. 추가 오류가 난 뒤에는 다시 시도하기 전에 파일을 확인하세요.

기본 파일 필터를 활용할 수 있는 경우

Apple은 파일 필터링을 콘텐츠를 입력으로 받아 필터로 범위를 좁힌 뒤 일치하는 결과를 다음 동작으로 전달하는 동작으로 설명합니다. 일반 필터 제어로 결과를 정렬하고 개수를 제한할 수 있습니다. 이런 작업은 파일을 선택하는 데 도움이 되지만, 그 자체로 텍스트를 추가하지는 않습니다. 찾기 및 필터 동작 소개, 필터 매개변수 추가하기

이 안내에서는 파일 패턴, 동일 시간 처리 방식, 기존 파일 요구 사항을 명확히 하기 위해 셸 스크립트에서 선택과 쓰기를 함께 처리합니다. 파일 동작을 사용해 다른 흐름을 만든다면 먼저 각 동작의 정보 보기를 확인하세요. 파일 객체, 텍스트로 변환된 파일 내용, 텍스트로 표시된 경로는 서로 다른 값입니다. Apple은 입력 및 출력 유형을 알아볼 수 있도록 동작 설명을 제공합니다. Mac의 단축어에서 동작 목록 탐색하기

샘플이 예상대로 작동하면 이를 변경할 때도 같은 조건을 분명하게 유지하세요. 텍스트 항목 하나, 지정된 로컬 폴더 하나, 적격 파일 중 수정 시간이 가장 최근인 파일 하나입니다. 이렇게 하면 실행할 때마다 결과를 예측할 수 있고 단축어가 멈췄을 때 살펴볼 위치도 분명해집니다.

출처