Je veux afficher tous les répertoires qui ne contiennent pas de fichiers avec une fin de fichier spécifique. J'ai donc essayé d'utiliser le code suivant:
find . -type d \! -exec test -e '{}/*.ENDING' \; -print
Dans cet exemple, je voulais afficher tous les répertoires, qui ne contiennent pas de fichiers avec la fin .ENDING
, mais cela ne fonctionne pas.
Où est mon erreur?
Réponses:
Voici une solution en trois étapes:
la source
comm -3 <(find . -type f -name \*ENDING -exec dirname {} \; |sort -u) <(find . -type d |sort -u)
Et c'est parti!
Ou alternativement (et plus pythonique):
Contenu bonus DLC!
La version (principalement) corrigée de la commande find:
la source
test: ...: binary operator expected
s'il y a plusieurs*.ENDING
fichiers dans un répertoire.next(filter(lambda x: x.endswith('.ENDING'), filenames))
pourrait également être écrit en utilisant la compréhension du générateur ienext(x for x in filenames if x.endswith('.ENDING'))
.if not any(x.endswith('.ENDING') for x in filenames)
fonction du fait que tout retourneFalse
pour un itérable vide.Le shell étend le
*
, mais dans votre cas, aucun shell n'est impliqué, juste la commande de test exécutée par find . D'où le fichier dont l'existence est testée, est littéralement nommé*.ENDING
.Au lieu de cela, vous devez utiliser quelque chose comme ceci:
Cela entraînerait une expansion de sh
*.ENDING
lors de l' exécution du test .Source: trouver globbing sur UX.SE
la source
-c: line 0: syntax error near unexpected token
(''. Mes noms de répertoire ont le format 'xyz (dfdf)'. En fait, c'est une bibliothèque de calibre.sh: line 0: test: foo1/bar.ENDING: binary operator expected
le répertoire contenant un fichier avec la finENDING
.sh: -c: line 0: syntax error near unexpected token
('sh: -c: ligne 0:' test -e test (test) / *. Fin '). / test (test) `. Mais quand je change .ending en .xyz j'obtiens le même résultat. C'est parce que j'ai des bractées comme nom de répertoire, non? Comment puis-je résoudre ce problème?Inspiré par les réponses de Dennis Nolte et MikeyB , j'ai trouvé cette solution:
Cela fonctionne basé sur le fait que
Au fait, c'est pourquoi stderr a été redirigé vers
/dev/null
.la source
Je le ferais en perl personnellement
Devrait faire l'affaire (fonctionne sur mon cas de test très simpliste).
la source
Voici une trouvaille.
find ./ -type d ! -regex '.*.ENDING$' -printf "%h\n" | sort -u
Edit : Oups, ne fonctionnera pas non plus.
la source
q
en egrep est pour le calmeAvec,
egrep
vous pouvez échanger l'expression régulière dont vous avez besoinls -1 "{}"
affiche les noms de fichiers à partir de la commande findla source