그래서 저는 이러한 파일 시스템 구조를 가지고 있습니다.
/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
ls
bash나 배열이 있는 다른 쉘에는 없습니다. (이름에 재미있는 문자가 포함되어 있어도 작동합니다):
$ 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
쉘은 /my.parent/my.folder*
이름이 알파벳순으로 시작하는 하위 디렉토리 목록으로 확장됩니다. 불러도 소용이 없습니다./my.parent
my.folder
ls
목록의 마지막 요소를 선택하려면 쉘에 배열이 있는 경우 목록을 배열에 넣고 마지막 요소를 선택하십시오.
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*
이 답변의 모든 코드는 일치하는 항목이 하나 이상 있다고 가정합니다.