Pobierz najnowszy katalog (nie najnowszy plik)


15

Mój folder parentma następującą zawartość:

A.Folder B.Folder C.File

Zawiera zarówno foldery, jak i pliki. B.Folderjest nowszy. Teraz chcę tylko B.Folder, jak mogę to osiągnąć? Próbowałem tego,

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

ale daje mi to drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder, ale potrzebuję tylko nazwy B.Folder.


1
użyj tegols -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا

Korzystanie z awk działa, ale chcę sprawdzić, czy istnieje czystsze rozwiązanie. :)
Daniel

odnaleźć . -maxdepth 1 -typ d | TZ = utc xargs ls -ld --full-time | sort -k 6
ctrl-alt-delor

Odpowiedzi:


24

Spróbuj tego:

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

-topcje lssortuj według czasu modyfikacji, najpierw najnowsze.

Jeśli chcesz usunąć /:

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

1
Jak pozbyć się cięć /?
Daniel

To nie działa, jeśli jesteś w innym folderze. Mam na myśli ls -td -- ./parent | head -n 1to, że nie daje mi poprawnych wyników, czy muszę używać podpowłoki za cd ./parentkażdym razem i wykonywać to polecenie? Jakieś rozwiązanie?
Daniel

@Daniel: Musisz uruchomić moją odpowiedź w bieżącym katalogu roboczym, aby zadziałała. W przeciwnym razie musisz użyć ścieżki względnej, takiej jak odpowiedź Hersona.
cuonglm

Usunięcie ostatniego / nie działa. Przykład: / home / cuo / bin / Oczekiwany: / home / cuo / bin
Marius

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

Różnica w stosunku do rozwiązania Herson za to po ukośnik *, co sprawia, że powłoka ignorować wszystkie pliki non-dir. Różni się od Gnouc , zadziała, jeśli jesteś w innym folderze.

Cut musi znać liczbę katalogów nadrzędnych (2), aby usunąć końcowe „/”. Jeśli tego nie masz, użyj

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

3

Obowiązkowa odpowiedź zsh:

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

Znaki w nawiasach to kwalifikatory globalne : /do dopasowywania tylko katalogów, omdo sortowania dopasowań według wieku i[1] do zachowania tylko pierwszego (tj. Najnowszego) dopasowania. Dodaj, Njeśli chcesz otrzymać pustą tablicę (zwykle dostajesz tablicę 1-elementy), jeśli nie ma podkatalogu parent.

Alternatywnie, zakładając, że parentnie zawiera żadnego znaku globowania powłoki:

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

Jeśli nie masz Zsh, ale masz najnowsze narzędzia GNU (tj. Niewbudowany Linux lub Cygwin), możesz użyć find, ale jest to uciążliwe. Oto jeden ze sposobów:

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")

Istnieje proste rozwiązanie ls, które działa, o ile nazwa katalogu nie zawiera znaków nowej linii lub (w niektórych systemach) znaków niedrukowalnych:

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


2

Następujące polecenie wykona zadanie nawet w przypadku nazwy katalogu zawierającej spację:

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

Zaktualizowane wyjaśnienie elementów w backticks jest:

  • . - bieżący katalog (możesz tutaj podać ścieżkę bezwzględną)
  • -mindepth/-maxdepth - ogranicz polecenie find tylko do bezpośrednich potomków bieżącego katalogu
  • -type d - tylko katalogi
  • -exec stat .. - wyświetla zmodyfikowany czas i nazwę katalogu ze znalezionego oddzielone tabulatorem (a nie spacją)
  • sort -n -r |head -1 | cut -f2 - data porządkuje katalog i wyświetla całą nazwę ostatnio zmodyfikowanej (nawet jeśli zawiera trochę miejsca jako domyślną kartę ogranicznika cięcia)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.