J'avais besoin d'une solution élégante pour le busybox (routeur), tous les xargs ou solutions de baie étaient inutiles pour moi - aucune commande de ce type n'est disponible là-bas. find and mtime n'est pas la bonne réponse car nous parlons de 10 éléments et pas nécessairement de 10 jours. La réponse d'Espo était la plus courte et la plus propre et probablement la plus universelle.
Les erreurs avec les espaces et lorsqu'aucun fichier ne doit être supprimé sont simplement résolus de la manière standard:
rm "$(ls -td *.tar | awk 'NR>7')" 2>&-
Version un peu plus éducative: nous pouvons tout faire si nous utilisons awk différemment. Normalement, j'utilise cette méthode pour passer (renvoyer) des variables de awk au sh. Comme nous lisons tout le temps ce qui ne peut être fait, je prie de différer: voici la méthode.
Exemple pour les fichiers .tar sans problème concernant les espaces dans le nom de fichier. Pour tester, remplacez "rm" par "ls".
eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}')
Explication:
ls -td *.tar
répertorie tous les fichiers .tar triés par heure. Pour appliquer à tous les fichiers du dossier courant, supprimez la partie "d * .tar"
awk 'NR>7...
saute les 7 premières lignes
print "rm \"" $0 "\""
construit une ligne: rm "nom de fichier"
eval
l'exécute
Puisque nous utilisons rm
, je n'utiliserais pas la commande ci-dessus dans un script! Une utilisation plus sage est:
(cd /FolderToDeleteWithin && eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}'))
Dans le cas de l'utilisation de la ls -t
commande ne fera aucun mal sur des exemples aussi stupides que: touch 'foo " bar'
ettouch 'hello * world'
. Non pas que nous ayons jamais créé des fichiers avec de tels noms dans la vraie vie!
Sidenote. Si nous voulions passer une variable au sh de cette façon, nous modifierions simplement l'impression (forme simple, aucun espace toléré):
print "VarName="$1
pour définir la variable VarName
sur la valeur de $1
. Plusieurs variables peuvent être créées en une seule fois. Cela VarName
devient une variable sh normale et peut être normalement utilisée dans un script ou un shell par la suite. Donc, pour créer des variables avec awk et les rendre au shell:
eval $(ls -td *.tar | awk 'NR>7 { print "VarName=\""$1"\"" }'); echo "$VarName"