ls의 출력을 사용하여 마지막으로 수정된 파일을 여는 방법은 무엇입니까?

ls의 출력을 사용하여 마지막으로 수정된 파일을 여는 방법은 무엇입니까?

ls -ltrwith 의 출력을 사용할 수 있는 방법이 있습니까 xargs?

ls의 결과는 아래와 같이 하나의 파일이라고 가정합니다.

ls -ltr | tail -1 | xargs -I{} open {}

비교를 위해 다음 명령을 사용하여 find를 사용하여 파일을 이동했습니다.

find ~/Downloads/ -iname '*hello*' -print0 | xargs -0 -I{} mv {} ./

어떻게든 NUL 문자를 사용할 수 있나요?


[해결됨]
@illkachu의 의견에서 언급했듯이 다음은 작동하지만 제안되지는 않습니다.

somecmd "$(ls -tr | tail -1)"

스테판이 제안하는 것은 대안인 것 같습니다.

답변1

일반적으로 의 출력은 ls안정적으로 후처리가 불가능하므로 그렇게 하지 않을 것입니다.

예를 들어:

open -- "$(ls -t | head -n 1)"

최신 파일 이름에 개행 문자가 포함되어 있으면 작동하지 않습니다.

이상적으로는 다음을 원할 것입니다.

ls -zt | head -zn1 | xargs -r0 open --

하지만 불행하게도 / 옵션을 ls지원하는 구현 을 알지 못합니다 .-z-0GNU 관리자는 ls최소한 여러 번 추가를 거부했습니다..

이제 일부 구현에는 다른 방법이 있습니다.

lsC 로케일에서 GNU 및 ast-open 구현을 사용하면 옵션이 포함된 출력을 , 또는 --quoting-style=shell-always다음으로 사후 처리할 수 있습니다 .zshksh93bash

export LC_ALL=C
eval "files=($(ls --quoting-style=shell-always -t))"

open -- "${files[0]}" # $files[1] with zsh

zsh에서는 그냥 할 수 있습니다

open ./*(om[1])

또는:

열려 있는 ./Ctrl+Xm

zsh수정 시간(및 기능을 훨씬 넘어서는 다른 많은 기준)별로 파일을 정렬하는 기능이 내장되어 있습니다 ls.

FreeBSD에는 json 또는 xml 출력을 생성하는 옵션이 ls있으므로 다음을 수행할 수 있습니다.--libxo

ls --libxo=json -t | perl -MJSON::PP -0777 -l0 -ne '
  print decode_json($_)
    ->{"file-information"}
    ->{directory}->[0]
    ->{entry}->[0]
    ->{name}' | xargs -r0 open --

하지만 그렇다면 모든 작업을 에서 수행하는 것이 더 간단할 것입니다 perl.

답변2

이미 말했듯이: 일반적으로 이것은 당신이 선택하고 싶은 접근 방식이 아닙니다. 그러나 시작은 다음과 같습니다.

ls -ltr | awk '/^-/ { print $9; }' | xargs

관련 정보