ls/find/etc를 사용하여 마지막 폴더(알파벳 내림차순 및 일치 패턴)를 얻는 방법은 무엇입니까?

ls/find/etc를 사용하여 마지막 폴더(알파벳 내림차순 및 일치 패턴)를 얻는 방법은 무엇입니까?

그래서 저는 이러한 파일 시스템 구조를 가지고 있습니다.

/my.parent
  -> my.folder1
     -> my-file1.txt
  -> my.folder2
     -> my-file2.txt
  -> another-folder-here
     -> another-file.txt

다음 일련의 명령을 사용하십시오.

ls -r /my.parent/my.folder* | head -n 1 | rev | cut -c 2- | rev

내가 원하는 my.folder2의 전체 경로를 반환합니다.내 문제는 단 하나의 폴더만 패턴과 일치하는 경우(예: my.folder1 삭제/이동) 전체 경로를 얻는 대신 my.folder2의 내용 목록을 얻는다는 것입니다.

모든 경우에 작동하도록 수정하는 방법에 대한 아이디어가 있습니까? 감사합니다.

답변1

ls내용을 나열하는 대신 폴더 이름을 표시 하려면 해당 매개 -d변수를 사용하십시오. 예:

ls -ld ~

답변2

lsbash나 배열이 있는 다른 쉘에는 없습니다. (이름에 재미있는 문자가 포함되어 있어도 작동합니다):

$ names=( my.parent/my.folder* ); echo ${names[-1]}
my.parent/my.folder2

배열이 없는 경우(흥미로운 문자에는 그다지 강력하지 않지만 분기를 저장합니다 ls):

$ printf "%s\n" my.parent/my.folder*  | tail -1
my.parent/my.folder2

답변3

출력을 구문 분석하지 않습니다.ls.

쉘은 /my.parent/my.folder*이름이 알파벳순으로 시작하는 하위 디렉토리 목록으로 확장됩니다. 불러도 소용이 없습니다./my.parentmy.folderls

목록의 마지막 요소를 선택하려면 쉘에 배열이 있는 경우 목록을 배열에 넣고 마지막 요소를 선택하십시오.

directories=(/my.parent/my.folder*)
last_directory="${directories[${#directories}-1]}"

쉘에 배열이 없으면 위치 인수를 통해 이를 수행할 수 있습니다.

set -- /my.parent/my.folder*
eval "last_directory=\${$#}"

그러면 현재 위치 매개변수를 덮어쓰게 됩니다. 이를 방지하려면 함수를 사용하세요.

set_to_last () {
  eval "$1=\${$#}"
}
set_to_last last_directory /my.parent/my.folder*

이 답변의 모든 코드는 일치하는 항목이 하나 이상 있다고 가정합니다.

관련 정보