získat pouze názvy souborů ... seřazené podle dne změny
find + sort + cut přístup:
find . -regex ".*/[0-9.]+" -printf "%example@unixlinux.online %f\n" | sort | cut -d' ' -f2
-
%example@unixlinux.online- Čas poslední úpravy souboru, kde@je sekundy odJan. 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 "%example@unixlinux.online %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 vstup až ls , 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í:
- To se opírá o substituci příkazů bez uvozovek (stejně jako použití
$OLDDATApozději). Proto předpokládá, že názvy souborů neobsahují žádné speciální znaky (mezery nebo zástupné znaky\[*?). - Některé verze
lsmůže změnit znaky, které nelze v aktuálním národním prostředí vytisknout. - Pokud je celková délka názvů souborů příliš dlouhá, zobrazí se chyba. (Všimněte si, že
find … -execaxargszde nemohu pomoci, protoželsmusí 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říkladls -t.
Notoricky neexistuje žádný jednoduchý způsob, jak to udělat robustně pomocí nástrojů POSIX nebo dokonce s nástroji GNU a ksh.