수정 시간을 기준으로 파일 정렬

수정 시간을 기준으로 파일 정렬

여기에서 다음과 같은 구조를 사용하는 많은 질문과 답변을 보았습니다.

list_dir=`ls -t /path/to/dir/`
for i in $list_dir; do

또는

ls -t | while read i; do

이제 난 당신을 알아요ls는 스크립트에 사용하면 안 됩니다.쉽게 깨지기 때문에 마지막으로 수정된 것부터 가장 최근에 수정된 것 순으로(또는 그 반대로) 파일을 조작하는 더 좋은 방법을 찾을 수 없습니다.

다음과 같은 것을 사용할 수 있습니다.

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

...하지만 이름에 줄 바꿈이 포함된 파일은 여전히 ​​손상되고 부팅하기가 더 나빠집니다. 더 좋은 방법이 있나요?

답변1

"스크립트에서 ls를 사용하지 마십시오"는 POSIX ls "only"의 문제입니다. GNU ls를 참조하세요 --quoting-style=.

GNU 정렬은 이 문제를 해결합니다 --zero-terminated.

호환되어야 하는 경우 find ... -exec이스케이프를 수행하는 스크립트에 파일 이름을 한 번에 하나씩 전달할 수 있습니다. 최소한 bash를 사용할 수 있는 경우:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb

답변2

가장 쉬운 방법은 zsh를 사용하는 것입니다. 이것글로벌 예선 omOm시간순 으로 사용되는 역순으로 일치 항목을 정렬합니다 .

for x in /path/to/dir/*(Nom); do …

디렉터리가 비어 있으면 glob N한정자가 패턴을 빈 목록으로 확장합니다. *(DNom)도트 파일과 일치하도록 만드세요 .

관련 정보