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
Paul Taylor
la source
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.

slhck
la source
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

tbenz9
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