최신 디렉터리 가져오기(최신 파일 아님)

최신 디렉터리 가져오기(최신 파일 아님)

내 폴더에는 parent다음 내용이 포함되어 있습니다.

A.Folder B.Folder C.File

그 안에는 폴더와 파일이 있습니다. B.Folder최신. 이제 나는 단지 을 얻고 싶습니다 B.Folder. 어떻게 이것을 달성할 수 있습니까? 나는 이것을 시도했다.

ls -ltr ./parent | grep '^d' | tail -1

하지만 그것은 나에게 주어졌지만 drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder나에게 필요한 것은 이름뿐이었습니다 B.Folder.

답변1

이 시도:

$ ls -td -- */ | head -n 1

-t옵션은 ls수정 시간을 기준으로 최신순으로 정렬됩니다.

삭제하려는 경우 /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1

답변2

ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

와는 다르다헤슨의 솔루션*은 쉘이 dir이 아닌 모든 파일을 무시하도록 하는 후행 슬래시입니다 . 와는 다르다그누크, 다른 폴더에 있으면 작동합니다.

Cut은 후행 "/"를 제거하려면 상위 디렉터리 수(2)를 알아야 합니다. 이것이 없으면 다음을 사용하십시오.

VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"

답변3

zsh 강제 답변:

latest_directory=(parent/*(/om[1]))

괄호 안의 문자는글로벌 예선: /디렉터리만 일치하고, om연령이 증가하는 순으로 일치 항목을 정렬하고, [1]첫 번째(즉, 최신) 일치 항목만 유지합니다. N없는 경우 .parent

또는 parent쉘 와일드카드가 포함되어 있지 않다고 가정합니다.

latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory

zsh는 없지만 최신 GNU 도구(예: 내장되지 않은 Linux 또는 Cygwin)가 있는 경우 이를 사용할 수 있지만 find번거롭습니다. 한 가지 방법은 다음과 같습니다.

latest_directory_inode=$(find parent -mindepth 1 -maxdepth 1 -type d -printf '%Ts %i\n' | sort -n | sed -n '1 s/.* //p')
latest_directory=$(find parent -maxdepth 1 -inum "$latest_directory_inode")

ls디렉터리 이름에 개행 문자나 (일부 시스템에서는) 인쇄할 수 없는 문자가 포함되어 있지 않은 한 작동하는 간단한 솔루션이 있습니다 .

latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}

답변4

다음 명령은 디렉터리 이름에 공백이 포함된 경우에도 작업을 수행합니다.

cp `find . -mindepth 1 -maxdepth 1 -type d  -exec stat --printf="%Y\t%n\n" {} \;  |sort -n -r |head -1 |cut -f2'`/* /target-directory/.

역따옴표 안에 있는 내용에 대한 업데이트된 설명은 다음과 같습니다.

  • .- 현재 디렉터리(여기서 절대 경로를 지정할 수 있음)
  • -mindepth/-maxdepth- find 명령을 현재 디렉토리의 하위 디렉토리로 제한합니다.
  • -type d- 디렉토리만
  • -exec stat ..- 수정 시간과 디렉터리 이름을 탭으로 구분하여 출력합니다(공백 대신).
  • sort -n -r |head -1 | cut -f2- 날짜별로 디렉토리를 정렬하고 가장 최근에 수정된 전체 이름을 출력합니다(일부 공백이 컷 기본 구분 탭으로 포함된 경우에도)

관련 정보