최신 디렉토리가 아닌 최신 디렉토리 가져 오기


15

내 폴더 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 -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا

awk를 사용하면 효과가 있지만 더 깨끗한 해결책이 있는지 알고 싶습니다. :)
Daniel

찾기 . maxdepth 1 유형 d | TZ = utc xargs ls -ld-풀 타임 | sort -k 6
ctrl-alt-delor

답변:


24

이 시도:

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

-t옵션은 ls수정 시간 을 기준으로 정렬합니다.

제거하려는 경우 /:

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

1
슬래시를 제거하는 방법 /?
Daniel

다른 폴더에 있으면 작동하지 않습니다. 나는 ls -td -- ./parent | head -n 1정확한 결과를 얻지 못한다는 것을 의미합니다 . cd ./parent매번 같은 서브 쉘을 사용 하고이 명령을 실행해야합니까? 어떤 해결책?
Daniel

@Daniel : 작동하려면 현재 작업 디렉토리에서 내 대답을 실행해야합니다. 그렇지 않으면 Herson의 답변과 같은 상대 경로를 사용해야합니다.
cuonglm 2016 년

마지막 / 제거가 작동하지 않습니다. 예 : / home / cuo / bin / 예상 : / home / cuo / bin
Marius

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

Herson의 솔루션과의 차이점 은 슬래시 이후 *이며 쉘이 모든 비 dir 파일을 무시하도록합니다. Gnouc 과의 차이점 은 다른 폴더에 있으면 작동합니다.

Cut은 후행 '/'를 삭제하려면 상위 디렉토리 수 (2)를 알아야합니다. 그것을 가지고 있지 않다면

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

3

의무 zsh 답변 :

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

괄호 안의 문자는 glob 한정자입니다 . /디렉토리 만 om일치시키고 연령을 늘려서 일치를 정렬 [1]하고 첫 번째 (즉, 최신) 일치 만 유지합니다. N하위 디렉토리가없는 경우 빈 배열 (일반적으로 1- 요소 배열)을 얻으려면 추가하십시오 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%/}


2

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

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 -날짜는 디렉토리를 정렬하고 가장 최근에 수정 된 이름의 전체 이름을 출력합니다 (잘라 내기 기본 구분 기호 탭으로 일부 공간이 포함되어 있어도)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.