find
Poleceń w systemie Linux ma wiele opcji w porównaniu z find
poleceniem na SunOS lub Solaris.
Chcę użyć find
polecenia w następujący sposób:
find data/ -type f -name "temp*" -printf "%TY-%Tm-%Td %f\n" | sort -r
Działa idealnie na komputerze z systemem Linux, ale to samo polecenie nie ma opcji -printf
na komputerze z systemem SunOS. Chcę dostosować dane wyjściowe w "%TY-%Tm-%Td %f\n"
formacie.
Proszę sugerować wszelkie alternatywy dla SunOS.
shell-script
find
solaris
Pratik Mayekar
źródło
źródło
find
w systemie Solaris, zainstaluj pakiet findutils .Odpowiedzi:
Zauważ, że nie ma to nic wspólnego z Linuksem; ten
-printf
predykat jest specyficzny dla implementacji GNUfind
. Linux nie jest systemem operacyjnym, to tylko jądro występujące w wielu systemach operacyjnych. Podczas gdy większość tych systemów operacyjnych korzystała kiedyś z przestrzeni użytkownika GNU, teraz ogromna większość systemów operacyjnych korzystających z Linuksa jest osadzona i ma podstawowe polecenia, jeśli takie mają.Komenda GNU
find
, która poprzedza Linuksa, może być zainstalowana na większości systemów operacyjnych uniksopodobnych. Z pewnością był używany w systemie Solaris (wtedy zwanym SunOS), zanim pojawił się Linux.Obecnie jest nawet dostępny jako pakiet Oracle dla Solaris. W
file/gnu-findutils
systemie Solaris 11 jest to włączone , a polecenie ma nazwęgfind
(dla GNUfind
, aby odróżnić je od polecenia systemufind
).Teraz, jeśli nie możesz zainstalować pakietów, najlepszym rozwiązaniem jest prawdopodobnie użycie
perl
:Nadal używamy
find
(implementacja Solaris), aby znaleźć pliki, ale używamy jego-exec
predykatu, aby przekazać listę plikówperl
. Iperl
robilstat()
na każdym, aby pobrać metadane pliku (w tym czas modyfikacji jako 10. element ($s[9]
)), interpretuje go w lokalnej strefie czasowej (localtime()
) i formatuje go (strftime()
), który następnie wyświetlaprint
obok nazwy pliku ($_
jest zmienną pętli, jeśli żaden nie jest podanyperl
i$!
jest odpowiednikiemstderror(errno)
tekstu błędu dla ostatniego niepowodzenia wywołania systemowego).źródło
ls
danych wyjściowych typu, patrz Specyfikacja trybu listy w pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.htmlfind
„s-printf
wyprzedza POSIX.2, więc ludzie są winni POSIX tutaj. Zauważ też, że specyfikacja POSIX była publiczna dopiero w 2000 roku. Nadal winiłbym ludzi GNU za wprowadzenie ichstat
ponad dekadę później za pomocą innej i gorszej składni dla specyfikacji formatu.Innym sposobem podejścia jest
find2perl
skrypt, który konwertuje (tutaj podzbiór)find
polecenia na odpowiedni skrypt perla. Skrypt perla używaFile::Find
modułu do ciężkiego podnoszenia. Ponieważ skrypt find2perl w moim systemie nie obsługiwał-printf
predykatu, dodałem go ręcznie:W dwóch przykładowych plikach, które utworzyłem, dane wyjściowe są takie same:
źródło