Usuwanie określonych plików na podstawie nazwy pliku z terminala

13

Mam katalog zawierający pliki o nazwach

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

i tak dalej. Chciałbym usunąć wszystkie te, które są wielokrotnością 5000.

Próbowałem następujących:, printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rmale to dało mi odpowiedź rm: missing operand.

Czy jest na to inny sposób?

BillyJean
źródło
6
Niezależnie od tego, jak to zrobisz, zalecamy (dla bezpieczeństwa) przeniesienie pożądanych plików do katalogu, a następnie, gdy potwierdzisz, że wszystkie i tylko pliki do usunięcia znajdują się w katalogu, usuń katalog.
user117529,
Bezpieczeństwo jest tutaj ważne. Generalnie lsnajpierw testuję te rzeczy .
Scot,

Odpowiedzi:

49

Nie potrzebujesz pętli ani dodatkowych poleceń tam, gdzie masz Bash Shell Brace Expansion.

rm -f rho_{0..200000..5000}.txt

Objaśnienie : {start..end..step}. Znak -fignorowania w przypadku nieistniejących plików.


Ps Aby zachować bezpieczeństwo i sprawdzić, które pliki zostaną usunięte, wykonaj najpierw test z:

ls -1 rho_{0..200000..5000}.txt
αғsнιη
źródło
13

rmnie odczytuje ze standardowego wejścia. Mógłbyś:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

Uwzględniam -iopcję rmmonitowania przed usunięciem, aby można było zweryfikować zachowanie. Gdy masz pewność, że robi to, co chcesz, możesz pominąć tę opcję.

Edycja: Alternatywnie możesz:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

Ta forma może być bardziej znana, jeśli wykonałeś jakiekolwiek programowanie.

Andy Dalton
źródło
12

Nie można potokować do programu tak, jakby treść potoku była argumentem. Jest wysyłany przez stdin.

W tym celu powinieneś użyć xarg:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

ale najpierw możesz wypróbować za pomocą echa, aby zobaczyć, czy wszystko jest tak, jak chcesz:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
M4rty
źródło
Jeśli twoja wersja seqma opcję -f/ --format, możesz jej użyć zamiast tego obejścia printfi zastępowania poleceń.
David Foerster,
Dziękuję, właśnie odpowiedziałem za pomocą polecenia użytego w pytaniu i próbuję wyjaśnić jego błąd rm
M4rty,
9

Ktoś poprawi mnie, jeśli się mylę, ale jeśli wszystkie pliki, które zaczynają rho_się od tego, mają tę formę, czy nie jest to równoważne z tym, aby zrobić

rm rho_0.txt rho_*[05]000.txt

Ponieważ liczba (inna niż 0) jest wielokrotnością 5000 wtedy i tylko wtedy, gdy kończy się na 0000 lub 5000.

(0 to szczególny przypadek, ponieważ jest wielokrotnością 5000, ale zwykle jest zapisywany bez dodatkowych zer wiodących. Jeśli nie zamierzasz uwzględniać 0, usuń go z powyższej linii.)

Oczywiście należy tego używać tylko wtedy, gdy wszystkie rho_*.txtpliki w twoim katalogu mają pożądaną formę. Nie używaj go, jeśli twój katalog również zawiera rho_please_dont_delete_me_5000.txt.

(Uwaga matematyczna: Działa to dokładnie dlatego, że wszystkie czynniki pierwsze 5000, a mianowicie 2 i 5, są również czynnikami podstawowymi podstawy, w której pracujemy, 10. Równolegle istnieje wystarczająco duża moc 10 (a mianowicie 10000), która jest podzielny przez 5000. Nie ma podobnej sztuczki dla dopasowania wszystkich tych, które są wielokrotnościami 3000.)

Nate Eldredge
źródło
To właściwie najlepsza odpowiedź.
cesarv