Sortuj pliki w katalogu rekurencyjnie na podstawie daty ostatniej modyfikacji

11

Sortuj pliki w katalogu rekurencyjnie na podstawie daty ostatniej modyfikacji

Zmodyfikowałem wiele plików w moim katalogu. Chcę wiedzieć, jakie to pliki, sortując je według daty ostatniej modyfikacji i chcę, aby niektóre rozszerzenia były wykluczone

w katalogu svn mam też wiele plików .svn, których nie chcę wyświetlać w tym rodzaju

Danny
źródło
Demo, jak wykluczyć rozszerzenie w mojej odpowiedzi.
mikeserv

Odpowiedzi:

18
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n

da ci coś takiego

2014-03-31 04: 10: 54.8596422640 ./foo
2014-04-01 01: 02: 11.9635521720 ./bar

n.st
źródło
Czy mogę wykluczyć rozszerzenie pliku z folderu ....
Danny
@Danny Tak, to łatwo z znalezisku: find -not -iname '*.ext'.
n.st.
znajdź -not -path " svn " -not -name "* svn" -printf "% TY-% Tm-% Td% TT% p \ n" | sort -n właśnie tego potrzebowałem dzięki bardzo @ n.st
Danny
5

Jeśli chcesz spłaszczyć strukturę katalogów (sortując według daty według wszystkich plików we wszystkich katalogach, ignorując katalog, w którym znajdują się pliki), możesz wybrać findpodejście sugerowane przez @yeti. Jeśli chcesz zachować strukturę katalogów, możesz spróbować

$ ls -ltR /path/to/directory

który sortuje na podstawie katalogu.

Andreas Wiese
źródło
1
to daje mi folder mądry, gdzie wszystko, czego potrzebuję, to wszystkie ostatnio zmodyfikowane pliki
Danny
5

W bash biegnij shopt -s globstarpierwszy. W ksh93 uruchom set -o globstarpierwszy. W Zsh jesteś już ustawiony.

ls -dltr **/*

Zwróci błąd, jeśli masz tyle plików, że limit długości wiersza poleceń w systemie został przekroczony. W Zsh możesz zamiast tego użyć tego:

print -rl -- **/*(Om)
Gilles „SO- przestań być zły”
źródło
To jedyna odpowiedź, która działa w systemie Solaris 10, dzięki! :)
laxxy
3

Zakładając, że wolisz znaleźć GNU, spróbuj:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

źródło
1
Można użyć find„s -printfopcję, aby uniknąć wywoływania oddzielny proces (lub kilka, w zależności od liczby plików). Zobacz moją odpowiedź na przykład.
n.
1
Wiedząc, że są na to inne sposoby, chciałem dać statszansę i pokazać -exec ... +. Naprawdę! Czasami myślę, że statzasługuje na większą uwagę ... i nikt nie powinien brać stąd przepisów, nie czytając o składnikach i nie myśląc o konsekwencjach ...
Btw ... nie każde znalezisko ma -printf...
1
@yeti - jeśli findnie masz -printf, możesz użyć, -exec sh -c 'printf...'aby uzyskać wiele z tej samej funkcjonalności. Obejmuje to również dostęp do $(pwd)w pełni kwalifikowanych ścieżek.
mikeserv
2
Spotkałem wielu użytkowników Linuksa, którzy nigdy nie czytali stat. Czasami więc chcę tylko zwrócić uwagę na stat... Myślę, że statzasługuje na to ...
2

Aby dokładnie wyświetlić listę nazw plików tylko przy użyciu najnowszych narzędzi GNU:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'
Graeme
źródło
2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

Pozwala to uniknąć problemów z listą argumentów, ponieważ jedynym argumentem ls, jaki kiedykolwiek otrzymasz, jest nazwa katalogu, który chcesz wyświetlić. Możesz to zrobić ze wszystkim, co chcesz.

Powłoka . sourcesjest |pipejak skrypt powłoki - jest to ten sam proces i nie ma problemów, które można napotkać po execvewywołaniu.

W każdym razie - powyższe idzie tylko na trzy głębokości, które można regulować poprzez zmianę maxdepth. Najpierw również głęboko - dzięki temu możesz cofnąć się do bieżącego katalogu depth.

Możesz zauważyć, że dostajesz $LSCOLORS- na mojej maszynie zapewnia również starannie wydrukowane kolumny i wszystko, czego chciałbyś od ls- lub, jeśli o to chodzi, wszystko, co możesz sobie wyobrazić, z czym chciałbyś zrobić. source.

NIE SVN

Znowu zrobi wszystko, czego można oczekiwać ls. Dlatego ukrywanie .svnplików jest tak proste, jak zmiana lslinii na:

ls -t --color=always --hide="*svn" "%p"\n

Lub jeśli chcesz zobaczyć svnrozszerzenia w każdym folderze, ALE ./svnmożesz to zmienić, aby całe polecenie wyglądało tak:

    find $DIR -depth -maxdepth 3 \
        -type d -readable -printf \
            'printf "\\n%p\\n" ; hide=
            [ "%p" = "./svn" ] && hide="*svn"
            ls -t --color=always --hide="$hide" "%p"\n' |\
    . /dev/stdin 2>&-

Osobiście podoba mi się to z ls -si, jeśli cię to obchodzi, -uposortuję według czasu dostępu, a nie czasu mod.

mikeserv
źródło
1

Ten będzie notować wszystko files w <dir>z najwyższą istotą najstarszy zmodyfikowany

find <dir> -type f -print0 | xargs -0 ls -ltr

A dzięki temu najnowsza modyfikacja jest najwyższa

find <dir> -type f -print0 | xargs -0 ls -lt

Zauważ, że działa to tylko wtedy, gdy lista nazw plików nie przekracza całkowitego limitu długości wiersza poleceń w twoim systemie.

UnX
źródło
to prawda, zapomniałem o tym
UnX
w celu uzyskania informacji na temat polecenia: lista arg za długa inulm.de/~mascheck/various/argmax
UnX
@Gilles: Masz na myśli xargs -0(w obu przypadkach).  xargs -print0jest równoważne xargs -p -r -i -n -t -0lub xargs -inprt0lub xargs -0ntrip, co prawdopodobnie nie jest tym, co miałeś na myśli.
Scott