J'exécute la commande:
echo $(ls -p "/root/arch" -1tr $(ls -1tr /root/pids/*.lock | awk -F/ '{print $NF}' | grep -Po '.*(?=\.)' | while IFS= read -r line; do echo "-I \"$line\" "; done) | grep -v / ) 20190107224626.ogg 20190107224705.ogg 20190107224720.ogg 20190107224645.ogg
3 Réponses :
S'il y a une chose que j'ai apprise dans mon court délai de lecture, des questions étiquetées étiquetées Bash , c'est que l'analyse de la sortie de Une approche alternative est ci-dessous. Il iTère sur chaque fichier dans résultat: p> ls code> est frontale sur.
arch / code>, et s'il ne trouve aucun nom de fichier correspondant avec un
.lock code> suffixe dans
pids / code>, il génère le nom de fichier : p>
[$ (($)] code> n'est pas génial non plus (il n'y a pas de savoir combien d'arguments séparés vers
trouver code> Les résultats seront séparé en). Et il n'y a aucune raison d'ici:
si [-E /root/pids/arline.lock]]; puis écho "$ ligne"; fi code> fait un travail parfaitement bon.
... aussi, trouver ... -Printf '% f \ n' | Alors que la ligne de lecture code> va mal se conduire avec des noms de fichiers se terminant dans des espaces blanche ou des noms de fichiers contenant des littéraux de barreaux au dos; Mieux vaut utiliser
trouver ... -Printf '% f \ 0' | tandis que ifs = lire -r -d '' ligne; faire code>, ce qui se comporte bien avec tous les noms possibles.
@CharlesDuffy Blast .. Clairement, j'ai besoin de relire la liste des pièges. J'ai mis à jour ma réponse avec votre recommandation. Merci.
Est-ce que cela trit par taille de fichier?
@Paulhodges négatifs .. est-ce une exigence d'OP que je ne vois pas?
Son ls code> utilise
-s code>, donc j'ai supposé donc.
@Paulhodges ah, je vois .. Je suis d'accord avec votre commentaire sur la question que ce n'est pas clair exactement quelle est la condition de tri.
Je vous ai tous confus, l'exigence de trier par date de création, c'est-à-dire que je voulais utiliser -tr, au lieu de -s. J'ai corrigé ma question.
Voici une doublure unique relativement simple pour le faire à l'aide de la manipulation de flux:
ls -p /root/{arch,pids} | grep -v / | sed 's/\.lock//g' | sort | uniq -u | xargs -l
Si je vous comprends correctement -
echo $( for f in /root/arch/* # get each item do n="${f##*/}" # strip path [[ -e "/root/pids/$n.lock" ]] || # if there's NO matching lock printf "%s\n" "$n" # then print the stripped filename done | sort -n # through a numeric sort ) # to be stacked on one line by echo
Probablement, mais en règle générale, j'évite pas i> quoi que ce soit quand c'est facile et ne complique pas vraiment la logique. YMMV, mais cela va faire l'évaluation en interne de toute façon, donc je préfère la façon dont ces documents auto-automatiques. C'est une question de goût. Une ligne supplémentaire pour la clarté n'est pas une grosse affaire et me donne un endroit où mettre un commentaire à côté de cela. ; OD mais puisque vous en parlez, je déteste aussi BLOAT, alors peut-être qu'un ou i> est meilleur ici.
Quel est l'objectif de la commande finale? Est-ce que doit seulement répertorier les fichiers de / racine / arcade qui n'ont pas de fichier .lock?
@Aidanlovelace, oui.
Si vous le souhaitez trier par date de création (ou voulez-vous dire nom de fichier, car ils sont datés numériques?), Pourquoi utilisez-vous
-s code>? Cela devrait être trier par taille.
@Paulhodges, je suis déjà confondu avec les commandes, au lieu de
-s code> je devais utiliser
-tr code>