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 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 "%[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 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í
$OLDDATA
později). Proto předpokládá, že názvy souborů neobsahují žádné speciální znaky (mezery nebo zástupné znaky\[*?
). - Některé verze
ls
můž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 … -exec
axargs
zde nemohu pomoci, protožels
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ří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.