Trova directory in cui mancano i file con una specifica estremità

Voglio visualizzare tutte le directory, che non contengono file con un file specifico che termina. Pertanto ho provato a utilizzare il seguente codice:

find . -type d \! -exec test -e '{}/*.ENDING' \; -print 

In questo esempio ho voluto visualizzare tutte le directory, che non contengono file con la fine .ENDING , ma questo non funziona.

  • È ansible TRIM sui dischi SSD in RAID 1?
  • OpenSSH come server SFTP: Trigger i cambiamenti riusciti e difettosi
  • Configurazione e configuration di un nuovo server VPS
  • bash: "set -e" e verificare se esiste un utente esegue l'output script
  • LUKS errore durante il boot
  • Postfix: Come smarthost, come posso limitare la posta in arrivo al dominio del mittente e al mittente IP?
  • Dov'è il mio errore?

    7 Solutions collect form web for “Trova directory in cui mancano i file con una specifica estremità”

    Ecco una soluzione in tre fasi:

     temeraire:tmp jenny$ find . -type f -name \*ENDING -exec dirname {} \; |sort -u > /tmp/ending.lst temeraire:tmp jenny$ find . -type d |sort -u > /tmp/dirs.lst temeraire:tmp jenny$ comm -3 /tmp/dirs.lst /tmp/ending.lst 

    Eccoci qui!

     #!/usr/bin/env python3 import os for curdir,dirnames,filenames in os.walk('.'): if len(tuple(filter(lambda x: x.endswith('.ENDING'), filenames))) == 0: print(curdir) 

    Oppure alternativamente (e più pitone):

     #!/usr/bin/env python3 import os for curdir,dirnames,filenames in os.walk('.'): # Props to Cristian Cliupitu for the better python if not any(x.endswith('.ENDING') for x in filenames): print(curdir) 

    Contenuto DLC di bonus!

    La versione (per lo più) corretta del command find:

     find . -type d \! -exec bash -c 'set nullglob; test -f "{}"/*.ENDING' \; -print 

    La shell espande la * , ma nel tuo caso non è inclusa la shell, solo il command di prova eseguito da Find . Quindi il file la cui esistenza è testata, viene letteralmente denominato *.ENDING .

    Invece dovresti usare qualcosa di simile:

     find . -type d \! -execdir sh -c 'test -e {}/*.ENDING' \; -print 

    Ciò comporterebbe che sh expanding *.ENDING quando il test viene eseguito.

    Fonte: trovare globbing su UX.SE

    Ispirato alle risposte di Dennis Nolte e MikeyB , mi sono presentata questa soluzione:

     find . -type d \ \! -exec bash -c 'shopt -s failglob; echo "{}"/*.ENDING >/dev/null' \; \ -print 2>/dev/null 

    Funziona basandosi sul fatto che

    se l'opzione di shell failglob è impostata e non vengono trovate corrispondenze, viene printingto un messaggio di errore e il command non viene eseguito.

    A proposito, è per questo che lo stderr è stato reindirizzato a /dev/null .

    Lo farei perl personalmente

     #!/usr/bin/perl use strict; use warnings; use File::Find; #this sub is called by 'find' on each file it traverses. sub checkdir { #skip non directories. return unless ( -d $File::Find::name ); #glob will return an empty arrays if no files math - which evaluates as 'false' if ( not glob ( "$File::Find::name/*.ENDING" ) ) { print "$File::Find::name does not contain any files that end with '.ENDING'\n"; } } #kick off the search on '.' - set a directory path or list of directories to taste. # - you can specify multiple in a list if you so desire. find ( \&checkdir, "." ); 

    Dovrebbe fare il trucco (funziona sul mio caso di prova molto semplicistico).

    Ecco un trovare uno-liner.

    find ./ -type d ! -regex '.*.ENDING$' -printf "%h\n" | sort -u

    Modifica : Oops, non functionrà neanche.

     find . -type d '!' -exec sh -c 'ls -1 "{}"|egrep -q "*ENDING$"' ';' -print 
    • q in egrep è per tranquillità

    • Con egrep è ansible scambiare il regex che ti serve

    • ls -1 "{}" emette i nomi di file dal command find

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.