Chcę usunąć wszystkie pliki z bieżącego drzewa katalogów, z wyjątkiem tych z save
. Uruchomiłem to polecenie:
find . \( -name save -prune \) -o -type f -ls | grep /save/
i nie znalazł żadnego. Ale kiedy uruchomiłem to polecenie:
find . \( -name save -prune \) -o -type f -delete
Wszystkie te pliki w / save / zniknęły. czego mi brakuje?
mv save/ ../some/safer/location
przed takim „ogólnym” poleceniem usuwania (... ale oczywiście przed twoim postem zrobiłbym to samo sprawdzenie i napotkałem ten sam problem!). Teraz znajdź dobre „cofnięcie usunięcia” dla systemu plików, w którym pliki były na ^^Odpowiedzi:
-delete
oznacza,-depth
że nie działa-prune
(-depth
zaczyna się od liści). Jest o tym ostrzeżenie w podręczniku wersji GNU (-delete
jest to rozszerzenie FreeBSD obsługiwane teraz także przez GNUfind
i kilka innych implementacji).Tutaj masz opcję użycia
rm
zamiast tego:(potencjalnie niebezpieczne, jeśli istnieją katalogi do zapisu przez innych, ponieważ można spowodować usunięcie plików poza bieżącym drzewem katalogów poprzez zastąpienie katalogów dowiązaniami symbolicznymi podczas uruchamiania tej komendy).
Bezpieczniejsza alternatywa:
To nie ma wyżej wspomnianego problemu, ale oznacza uruchomienie jednego
rm
na plik. Jest--
to konieczne do implementacji FreeBSD, a nie GNU, który poprzedza nazwy plików./
.Alternatywnie, jak sugeruje Costas:
(ale to wciąż niepotrzebnie schodzi do
save
katalogów)LC_ALL=C
Jest tak*
dopasowuje dowolną sekwencję bajtów (nawet tych, które nie tworzą poprawnych znaków w bieżącej lokalizacji). Pamiętaj, że wpłynie to na język komunikatów o błędach (angielski zamiast języka użytkownika).źródło
rm
?