GNU/Linux >> Znalost Linux >  >> Linux

Jak seřadit výsledky příkazu Najít podle data?

získat pouze názvy souborů ... seřazené podle dne změny

find + sort + cut přístup:

find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort | cut -d' ' -f2
  • %[email protected] - Čas poslední úpravy souboru, kde @ je sekundy od Jan. 1, 1970, 00:00 GMT, se zlomkovou částí

  • %f - Název souboru s odstraněnými hlavními adresáři (pouze poslední prvek)

Postup řazení v sestupném pořadí:

find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort -k1,1r | cut -d' ' -f2

Vaši metodu lze upravit tak, aby fungovala v jednoduchých případech. Hlavním problémem, kterému čelíte, je to, že předáváte vstupls , ale ls nebere žádný vstup. ls přebírá argumenty příkazového řádku. Takže musíte předat výstup find jako argumenty na ls , se záměnou příkazů. Také v případě, že je adresář nalezen, předejte -d na ls vypsat samotný adresář a ne jeho obsah.

OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))

Pouze v jednoduchých případech, protože existují dvě omezení:

  1. To se opírá o substituci příkazů bez uvozovek (stejně jako použití $OLDDATA později). Proto předpokládá, že názvy souborů neobsahují žádné speciální znaky (mezery nebo zástupné znaky \[*? ).
  2. Některé verze ls může změnit znaky, které nelze v aktuálním národním prostředí vytisknout.
  3. Pokud je celková délka názvů souborů příliš dlouhá, zobrazí se chyba. (Všimněte si, že find … -exec a xargs zde nemohu pomoci, protože ls musí běžet jednou, aby bylo správné pořadí názvů souborů. Jediné, co mohli udělat, je skrýt chyby a vytvořit výstup, který není správně seřazen – a zkombinovat několik dalších znaků, v případě xargs .)

Robustní a jednoduchý způsob, jak toho dosáhnout, je použít zsh. Má schopnost třídit shody zástupných znaků díky kvalifikátorům glob.

setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
  • Vzhledem k tomu, že toto nevolá žádný jiný program, neexistuje žádný limit délky kromě dostupné paměti a nehrozí zde žádné riziko pozměnění názvu souboru.
  • Výsledkem je seznam řetězců (každý řetězec je název souboru), nikoli řetězec, takže jde do proměnné pole.
  • **/ prochází podadresáře rekurzivně a vyhýbá se použití find .
  • ## znamená „jeden nebo více z předchozích“ v rozšířené syntaxi glob zsh, je to analogie k + v (rozšířené) syntaxi regulárního výrazu.
  • (om) je glob kvalifikátor pro třídění souborů podle času úpravy, například ls -t .

Notoricky neexistuje žádný jednoduchý způsob, jak to udělat robustně pomocí nástrojů POSIX nebo dokonce s nástroji GNU a ksh.


Linux
  1. Jak seřadit výstup Du podle velikosti?

  2. Jak získat pouze soubory vytvořené po rande s Ls?

  3. Jak mohu rekurzivně vypsat seznam všech adresářů na místě, nejprve na šířku?

  1. Jak najít a seřadit soubory na základě data a času úpravy v Linuxu

  2. Jak přenést výsledky 'najít' do mv v Linuxu

  3. Jak najít největší adresáře nebo největší soubory?

  1. Jak najít velké soubory linux pomocí příkazů find a du

  2. Jak udělat Ls a pak seřadit výsledky podle data vytvoření?

  3. Linux – Jak zjistit datum vytvoření souboru?