Jeśli chcesz zapętlać pliki, nigdy nie używajls
*. tl; dr Istnieje wiele sytuacji, w których możesz usunąć niewłaściwy plik, a nawet wszystkie pliki.
To powiedziawszy, niestety jest to podstępna rzecz, którą należy zrobić dobrze w Bash. Jest to odpowiedź na pracę nad pomocą duplikatu pytanie mój nawet starszefind_date_sorted
, które można używać z małymi modyfikacjami:
counter=0
while IFS= read -r -d '' -u 9
do
let ++counter
if [[ counter -gt 3 ]]
then
path="${REPLY#* }" # Remove the modification time
echo -e "$path" # Test
# rm -v -- "$path" # Uncomment when you're sure it works
fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first
* Bez przestępstw - użyłem też ls
wcześniej. Ale to naprawdę nie jest bezpieczne.
Edycja: Nowośćfind_date_sorted
z testami jednostkowymi.
((++counter>3))
jako swój test. Jest ładnie zwięzły. Jeśli chodzi o onelinerów: jeśli zwięzłość jest problemem, zawiń kod w funkcji, nie martw się o to.Aby usunąć wszystkie oprócz 3 najnowszych plików za pomocą globu zsh, możesz użyć
Om
(wielkich O) do sortowania plików od najstarszych do najnowszych oraz indeksu dolnego do przechwycenia żądanych plików.Inne przykłady:
źródło
Zdecydowanie najłatwiejszą metodą jest użycie zsh i jego globalnych kwalifikatorów :
Om
sortowanie według malejącego wieku (tj. Najpierw najstarsze) i[1,3]
zachowanie tylko trzech pierwszych dopasowań.Zobacz także Jak filtrować glob w Zsh, aby uzyskać więcej przykładów.
I postępuj zgodnie z radą L0B0 : Twój kod będzie strasznie pękał, jeśli będziesz mieć nazwy plików zawierające znaki specjalne powłoki.
źródło
Aby pobrać najnowszy plik z katalogu, możesz użyć następującej funkcji:
Daj mu inny zestaw plików, usuwając najnowszy plik po każdej iteracji.
Wskazówka: Jeśli trzymasz początkowy zestaw plików w tablicy o nazwie „$ {files [@]}”, zapisz indeks znalezionego najnowszego pliku i
unset 'files[index]'
przed następną iteracją.Stosowanie:
newest_in [set of files/directories]
Przykładowe dane wyjściowe:
źródło
Po pierwsze,
-R
opcja dotyczy rekurencji, która prawdopodobnie nie jest tym, czego chcesz - będzie ona również wyszukiwać we wszystkich podkatalogach. Po drugie,<
operator (gdy nie jest postrzegany jako przekierowanie) służy do porównywania ciągów. Prawdopodobnie chcesz-lt
. Próbować:Ale skorzystałbym z find tutaj:
źródło
Wiem, że parsowanie jest grzechem
ls
, ale co z tym:Szybki test z 5 pustymi plikami:
źródło
ls
danych wyjściowych oraz niewłaściwego użyciafind
ixargs
razem. Jeśli połączyszfind
ixargs
polecam użyć opcjifind
s-print0
i odpowiednioxargs
s-O
. Przeczytaj o używaniu Znajdź, aby uzyskać więcej informacji na temat. Możesz także rzucić okiem i przeczytać, dlaczego Parsing ls jest bardzo zły.Ten jednowarstwowy robi wszystko, co myślę:
źródło
Oto jedno rozwiązanie:
źródło