Mój cel jest zwodniczo prosty (przynajmniej dla mnie). Chcę wziąć wynik ls -l
lub ls -lh
i wybrać tylko jedno pole.
Chcę, aby było to jak najbardziej kuloodporne, co oznacza, załóżmy, że nazwy plików mogą mieć zmienną liczbę spacji, nie wszystko w polu ma taką samą długość itp.
Punkty bonusowe za posiadanie skryptu, który pobierze nazwę pola (lub nawet tylko numer pola), a następnie zwróci zawartość pola.
Chcę się odwrócić
w:
command-line
bash
soandos
źródło
źródło
ls
.find
Polecenia jest ogromnie pomocne.ls -l --block-size=M
?ls
Komenda nie jest standardem POSIX, więc skrypt zależny odls
może się zepsuć na różnych systemach, a nawet z czasem. Zobacz odpowiedź @ormaaj na tej stronie, aby uzyskać więcej informacji. Jednym ze sposobów zrobienia tego, o co prosisz, jest pętla Bash. Oto przykład.for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done
. Oczywiście zamiast tegoecho
użyłbyś swojego przetwarzania.... | xargs -d '\n' du -m
którego działa równie dobrze.-exec
opcjifind
.Nigdy nie analizuj ls . Użyj GNU
find
. Lub jeśli przenośność nie jest ważnestat(1)
.Aby odczytać dane inne niż listy nazw plików linia po linii i podzielić na pola, patrz: BashFAQ / 001
Nie ma metod, aby wiarygodnie odczytać listę nazw plików rozdzielaną znakiem nowej linii, która ma sens w większości przypadków.
źródło
Możesz pobrać konkretną kolumnę w powłoce, taką jak:
lub
awk
jak pokazano w odpowiedzi @Corey ,cut -c44-45
działałby również po dostosowaniu (ponieważls
ma ustalone kolumny) lub cokolwiek innego, jednak głównym problemem jest to, że nie będzie niezawodny i kuloodporny (np. w Uniksie może być$6
, nie$7
, i zmienia się w zależności od argumentów), co powoduje, że nie jest przyjazny dla maszyny, dlatego w ogóle nie zaleca się analizowanials
poleceń .Najlepiej jest użyć różnych dostępnych poleceń, takich jak
find
lubstat
, które mogą zapewnić odpowiednie opcje formatowania danych wyjściowych według potrzeb. Na przykład:Aby zwrócić kolumnę zawierającą tylko dni modyfikacji, spróbuj tego przykładu:
Warto zauważyć, że GNU
stat
może mieć inne opcje niż BSDstat
, więc nadal nie będzie kuloodporny w różnych systemach operacyjnych.źródło
stat
.date
jednak jest niepoprawnie skonfigurowany. Powinieneś dodać--date=$ymd
, ponieważdate
sam wydrukuje bieżący dzień, ale tutaj celem jest konwersja formatu daty plikuls -la | cut -c32-33
Komenda w całkowitej uczciwości jest po prostu całkowicie niewiarygodne, nie tylko z powodu możliwych pułapek z nazwami, ale po prostu dlatego, że to zależy od długości i pliki nazwy użytkownika wielkości.stat -c "%x" *.*
Komenda wygląda ok, ale stosując*.*
jesteś restricing go tylko do nazw plików zawierających kropkę. Wydaje mi się, że celem było złapanie również ukrytych plików; w takim przypadku należy włączyć globbing dla dotfiles wcześniej i użyć*
zamiast*.*
:shopt -s dotglob; stat -c "%x" * | [...]
.--date="$ymd"
dodate
polecenia, w przeciwnym razie wydrukuje bieżący dzień miesiąca.