Jak usunąć tylko zawartość katalogów?

14

Jestem w folderze: /var/myfolder.

Wewnątrz znajdują się inne foldery, takie jak: /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/itp.

Wewnątrz każdego znajduje się kilka plików o losowych nazwach. Jak usunąć wszystkie pliki ze wszystkich folderów w środku /var/myfolder?

Struktura (wszystkie katalogi, np. A, B, C itp. Wewnątrz /var/myfolder) powinna pozostać nienaruszona.

IroeN
źródło

Odpowiedzi:

17

Próbować:

find /var/myfolder -type f -delete

Spowoduje to pobranie wszystkich zwykłych plików w katalogu / var / myfolder i usunięcie ich, pozostawiając tylko katalogi.

StarNamer
źródło
Dzięki za rozwiązanie. Powinienem wspomnieć, że robię to w Solaris 9, więc moje znalezisko nie ma opcji -delete, ale to dobry punkt wyjścia.
IroeN
2
Byłem w stanie wymyślić następujące rozwiązanie: find / var / myfolder -type f -exec rm -f {} \;
IroeN
2
Przepraszam. Używam Debiana lub Ubuntu. Twoje rozwiązanie jest równoważne, o ile wiem.
StarNamer
6
-type f! =! -type d
mikeserv
7

W przypadku zsh użyj . kwalifikatora glob, aby dopasować tylko zwykłe pliki:

rm -- **/*(.)

Spowoduje to rekurencyjne usunięcie wszystkich (nie ukrytych) zwykłych plików w bieżącym katalogu i jego podkatalogach. Dodaj Dkwalifikator glob, aby usunąć również ukryte zwykłe pliki (i zwykłe pliki w ukrytych katalogach).

Gilles „SO- przestań być zły”
źródło
Używam bash.
IroeN,
1
@ user6554: ... które nie wskazują ani twoje pytanie, ani użyte tagi;)
0xC0000022L
3

Można uruchomić rm */*w/var/myfolder

Dinesh
źródło
3
find . -depth -exec rm {} + 2>/dev/null

rm nie usuwa katalogów - więc po prostu uruchom go na wszystkim.

Aby zachować dowiązania symboliczne do katalogów:

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

I myślę, że powinno to również działać w nieco zoptymalizowany sposób, jeśli istnieje wiele plików, które mogą wymagać przetestowania w powyższej wersji:

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +
mikeserv
źródło
Zauważ, że GNU findma taką -xtypeopcję.
Stéphane Chazelas
@ StéphaneChazelas - ast też. ale wcale nie potrzebowałem -głębości, nie sądzę. trzymałem go na pierwszym miejscu, aby uniknąć tylu wywołań błędów - wyciszonych czy nie - ale w innych było to głupie.
mikeserv
1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print
norki
źródło
0
rm var/myfolder/*/*

Usunie wszystko z podfolderów bez dotykania samych podfolderów.

Pierwszy *jest dla podkatalogów myfoldersobie ( A, B...). Drugi *jest dla plików A, Bitp

Jeśli istnieje więcej folderów wewnątrz A, Bitp Pierwszy bieg: rm /var/myfolder/*/*/*uruchom rm /var/myfolder/*/*.

Edgar Naser
źródło
0

Powinieneś być w stanie wykonać cd na górę danego drzewa katalogów, a następnie uruchomić:

find . -type f -print0 | xargs -0 rm -rf

i to powinno usunąć wszystkie pliki, pozostawiając nietknięte drzewo katalogów. Opcje -print0 i -0 można pominąć, jeśli masz pewność, że nie masz żadnych nazw plików lub katalogów zawierających spacje.

Polecenie find rozróżnia pliki (-type f) i dowiązania (-type l), więc powinno to pozostawić nietknięte linki, jeśli takie istnieją. Jednak nie przetestowane. W razie wątpliwości uruchom:

odnaleźć . -typ l

i sprawdź, czy coś się pojawi przed uruchomieniem wcześniejszego polecenia find.

rjh427
źródło
Czy możesz wyjaśnić, w jaki sposób rmflaga -r, -R, --recursive - remove directories and their contents recursivelydo tego pasuje?
Stephen Rauch,
Ponieważ nie uruchamiamy rm -rf, uruchamiamy find. -type f, a następnie potokowanie danych wyjściowych z tego do rm -rf. Usuwa więc tylko pliki, nie dotyka katalogów. Właśnie to xargs robi, pobiera dane wyjściowe z polecenia po lewej stronie i wysyła je do polecenia po prawej stronie.
rjh427
Dokładnie o to mi chodzi. Jeśli nie przekazujesz żadnych katalogów, jaki jest pożytek z flagi, która działa tylko na katalogach?
Stephen Rauch,
Ponieważ pamięć mięśni i nadal działa. Mógłbyś zgłosić ten sam sprzeciw wobec opcji -f „force”, dałbym ci tę samą odpowiedź.
rjh427
-2

Po prostu użyj poniższego polecenia:

sudo rm -rf directory_in_which_you_have_content / *

---------------- LUB --------------------------------- -----------------------

„*” Oznacza wszystko, więc kiedy użyjesz *, usuniesz całą zawartość. więc albo użyj takiego polecenia, albo przejdź do katalogu, w którym chcesz usunąć całą zawartość, i po prostu użyj poniższego polecenia:

sudo rm -rf *

keyur bhatt
źródło