Essayer de trouver des dossiers qui ne contiennent qu'un fichier


2

J'aimerais une commande de recherche (ou similaire) qui, lorsqu'elle est dirigée vers un dossier, répertorie tous les fichiers présents dans ce dossier ou l'un de ses sous-dossiers, mais uniquement si le dossier contient un seul fichier. En d'autres termes, je souhaite répertorier le contenu des dossiers ne contenant qu'un fichier.

Donc, étant donné les fichiers suivants

/Foldera/folderb
/Foldera/folderb/test1.txt
/Foldera/folderb/test2.txt
/Foldera/folderc
/Foldera/folderd/test3.txt
/Foldera/folderc/foldere

il sortirait

/Foldera/folderd/test3.txt

1
Quel système d'exploitation utilisez-vous?
— Matthew Williams

osx 10.9.1 (Mavericks)
— Paul Taylor

Réponses:


0

Avec Bash 3:

find . -type d -exec sh -c \
'[[ $(find "$0" -mindepth 1 | wc -l) -eq 1 ]] && [[ $(find "$0" -mindepth 1 -type d | wc -l) -eq 0 ]]  && echo "$0"' \
{} \;

Avec Bash 4:

shopt -s globstar
for dir in **/; do 
  [[ $(find "$dir" -mindepth 1 | wc -l) -eq 1 ]] && [[ $(find "$dir" -mindepth 1 -type d | wc -l) -eq 0 ]]  && echo "$dir"
done

En gros, parcourez tous les répertoires, puis vérifiez si ce répertoire contient exactement un enfant (fichier ou répertoire) et vérifiez si cet enfant n'est pas un répertoire. S'il y a exactement un enfant et que ce n'est pas un répertoire, echo il.

Soyez averti: cela échoue si les répertoires ou les fichiers contiennent une nouvelle ligne dans leur nom.

Ce serait peut-être plus facile à faire si vous aviez des utilitaires GNU tels que find avec un -printf option mais OS X ne l’a pas par défaut.


En fait, j'ai réussi à essayer cela aujourd'hui, et le script bash3 répertorie les dossiers avec un fichier plutôt que les fichiers qu'il contient, est-ce que cela peut être changé? Je ne semble pas avoir bash4, donc le deuxième script ne fonctionne pas se plaindre. Globstar ne fonctionne pas.
— Paul Taylor

Pour cela, tout ce que vous auriez à changer le echo "$0" à find "$0".
— slhck

merci, ok chose finale, j'ai réalisé que j'avais besoin que la sortie du chemin soit le chemin complet, et non par rapport à l'emplacement de départ, comment puis-je le faire s'il vous plaît?
— Paul Taylor

okay travaillé, il suffit de passer chemin en paramètre, et utiliser find $ 1 au lieu de find., et assurez-vous que le chemin fourni est absolu et non relatif
— Paul Taylor

-1

Je n'ai pas de Mac pour tester cela, mais j'ai trouvé beaucoup de réponses lorsque j'ai cherché dans votre question.

find . -type 'f' -printf '%h\n' | sort | uniq -c

Cela affichera le nombre de fichiers dans chaque dossier, puis en utilisant grep ou un autre outil, vous pourrez le réduire.

Je voudrais vérifier la source ci-dessous, c'est pour Windows mais ils ont beaucoup de solutions Perl qui pourraient fonctionner aussi bien.

Question similaire: La source


Cela ne fonctionne pas sous OS X 10.9 car il n'est pas livré avec GNU find mais BSD find qui n'a pas de -printf option. Voir: developer.apple.com/library/mac/documentation/Darwin/Reference/…
— slhck
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.