web-dev-qa-db-fra.com

Utilisation de busybox pour supprimer récursivement certains fichiers

Comment puis-je trouver et supprimer tous les fichiers .jpg? -déléter ne semble pas fonctionner ...

[/share/Multimedia/Music] # find . -name '*.jpg' -delete
BusyBox v1.01 (2015.01.25-18:47+0000) multi-call binary

Usage: find [PATH...] [EXPRESSION]

Search for files in a directory hierarchy.  The default PATH is
the current directory; default EXPRESSION is '-print'

EXPRESSION may consist of:
    -follow     Dereference symbolic links.
    -name PATTERN   File name (leading directories removed) matches PATTERN.
    -print      Print (default and assumed).
    -type X     Filetype matches X (where X is one of: f,d,l,b,c,...)
    -perm PERMS Permissions match any of (+NNN); all of (-NNN); or exactly (NNN)
    -mtime TIME Modified time is greater than (+N); less than (-N); or exactly (N) days
5
user1543368

Vous semblez utiliser Busybox find, pas GNU find . Bien que Busybox find soit supposé prendre en charge -delete, la version avec Ubuntu ne semble pas l'être.

$ busybox find --help
BusyBox v1.21.1 (Ubuntu 1:1.21.0-1ubuntu1) multi-call binary.

Usage: find [PATH]... [OPTIONS] [ACTIONS]

Search for files and perform actions on them.
First failed action stops processing of current file.
Defaults: PATH is current directory, action is '-print'

    -follow     Follow symlinks
    -xdev       Don't descend directories on other filesystems
    -maxdepth N Descend at most N levels. -maxdepth 0 applies
            actions to command line arguments only
    -mindepth N Don't act on first N levels
    -depth      Act on directory *after* traversing it

Actions:
    ( ACTIONS ) Group actions for -o / -a
    ! ACT       Invert ACT's success/failure
    ACT1 [-a] ACT2  If ACT1 fails, stop, else do ACT2
    ACT1 -o ACT2    If ACT1 succeeds, stop, else do ACT2
            Note: -a has higher priority than -o
    -name PATTERN   Match file name (w/o directory name) to PATTERN
    -iname PATTERN  Case insensitive -name
    -path PATTERN   Match path to PATTERN
    -ipath PATTERN  Case insensitive -path
    -regex PATTERN  Match path to regex PATTERN
    -type X     File type is X (one of: f,d,l,b,c,...)
    -perm MASK  At least one mask bit (+MASK), all bits (-MASK),
            or exactly MASK bits are set in file's mode
    -mtime DAYS mtime is greater than (+N), less than (-N),
            or exactly N days in the past
    -mmin MINS  mtime is greater than (+N), less than (-N),
            or exactly N minutes in the past
    -newer FILE mtime is more recent than FILE's
    -inum N     File has inode number N
    -user NAME/ID   File is owned by given user
    -group NAME/ID  File is owned by given group
    -size N[bck]    File size is N (c:bytes,k:kbytes,b:512 bytes(def.))
            +/-N: file size is bigger/smaller than N
    -links N    Number of links is greater than (+N), less than (-N),
            or exactly N
    -Prune      If current file is directory, don't descend into it
If none of the following actions is specified, -print is assumed
    -print      Print file name
    -print0     Print file name, NUL terminated
    -exec CMD ARG ; Run CMD with all instances of {} replaced by
            file name. Fails if CMD exits with nonzero

Je ne sais pas pourquoi vous utilisez Busybox find, mais essayez plutôt avec /usr/bin/find. Ou -exec rm {} + (pas de support pour -execdir ni) ou la solution xargs proposée par Rinzwind.

6
muru
find . -type f -name "*.jpg" -exec rm -vf {} +

Cela supprimera les "fichiers" (et non les "répertoires") se terminant par ".jpg".

Attention, vous ne devez PAS faire cela en tant que root. Une erreur dans la commande peut tuer votre système et, lorsque vous n'utilisez pas root, vous risquez une erreur lors d'une erreur d'autorisation.

Il n’est pas possible de revenir en arrière sauf si vous avez créé une sauvegarde.

Si vous faites un

find . -type f -name "*.jpg" | more 

vous obtiendrez une liste des fichiers sur le point d'être supprimés (le | more vous indiquera le résultat en pages).


find . type f -name "*.jpg" -print0 | xargs -0 rm

fonctionne aussi. Même principe: les résultats sont acheminés vers la commande xargs qui effectue un rm pour chaque fichier trouvé.

4
Rinzwind

Pour les très anciennes versions de BusyBox (utilisées malheureusement par mon NAS QNAP), les suggestions utilisant -print0, -exec et -delete ne fonctionnent pas.

J'ai dû créer une liste et utiliser une boucle:

IFS=$'\n' aFiles=( $(find . -name '*.jpg') );
for sFile in "${aFiles[@]}"; do rm "${sFile}"; done

La commande divisée en deux étapes permet de vérifier si les fichiers trouvés sont corrects avant de les supprimer.

0
Potherca