Come tagliare l'estensione dal path con gli strumenti di base UNIX

Ho bisogno di raccogliere un elenco di file e metterlo in un file di text. Tuttavia, i file non devono includere la loro estensione.

Il command che ho ora senza rimuovere le estensioni di file:

ls -1 /a/dir/*/dir/* > textfile 

Tutti i file selezionati avranno un'estensione di. [Az] {3}

(il motivo per cui ho bisogno di questo è perché ho bisogno di un elenco di nomi di base unique e unique risolverà che dopo questo passaggio)

  • Dov'è la posizione migliore per mantenere i file di siti condivisi di sviluppatori nella gerarchia di linux?
  • Samba4 ha bloccato i file pst
  • Sistema da utilizzare per mantenere una directory aziendale
  • iptables Suggerimenti & trucchi
  • Non riesco a pingare il mio gateway, ma posso ssh ad un server remoto. Perché?
  • Linux: sysadmins produttivi senza root (proteggere la properties; intellettuale)?
  • Samba4 consulenza per l'utilizzo della produzione
  • Fresh Red Hat Enterprise Linux non installa httpd usando yum
  • 7 Solutions collect form web for “Come tagliare l'estensione dal path con gli strumenti di base UNIX”

    Mi piace sempre includere una sola soluzione bash:

     for file in /a/dir/*/dir/*; do echo "${file%.*}" >> ~/file_list done 

    e con un'istruzione opzionale se limitare il file all'estensione richiesta:

     shopt -s extglob for file in /a/dir/*/dir/*; do if [[ "$file" =~ \.[a-zA-Z]{3}$ ]]; then echo "${file%.*}" >> ~/file_list fi done 

    In questa simile domanda serverfault spiego l'espansione del parametro "$ {file%. *}".

    Qualcosa di simile avrebbe elencato il file nella directory corrente rimuovendo tutto dopo il primo punto.

    find . -maxdepth 1 -type f | xargs -iZ basename Z | cut -d"." -f1 > /tmp/resultfile

    Eventualmente avrebbe un problema con i file nascosti con una row vuota nel file di risultati. Il nome di base è qui solo per sbarazzarsi del "./" che inizia i nomi di file nel risultato della ricerca .

    Che ne dite di:

     ls -1 / a / dir / * / dir / * |  sed -e 's / \. [a-zA-Z0-9] \ {3 \} $ //'
    

    Dovrebbe fare quello che vuoi.

    È molto più semplice di quanto si pensi:

     asd @ locutus: ~ $ IZE = file.avi
     asd @ locutus: ~ $ echo $ IZE
     file.avi
     asd @ locutus: ~ $ echo $ {IZE %%. ???}
     file
     asd @ locutus: ~ $ 
    

    Così in questo modo:

     ls -1 / a / dir / * / dir / * |  mentre leggeva VAR;  fare echo $ {VAR%. ???};  fatto
    

    Puoi fare quello che vuoi tra do e fatto, l'eco è solo un esempio.

    bash bash (Parameter Expansion):

      ${parameter%%word} The word is expanded to produce a pattern just as in pathname expansion. If the pattern matches a trailing portion of the expanded value of param‐ eter, then the result of the expansion is the expanded value of parameter with the shortest matching pattern (the ''%'' case) or the longest match‐ ing pattern (the ''%%'' case) deleted. If parameter is @ or *, the pat‐ tern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an arrays vari‐ able subscripted with @ or *, the pattern removal operation is applied to each member of the arrays in turn, and the expansion is the resultant list. 

    Una risposta più generica, trova estensioni di qualsiasi lunghezza:

     find . -type f | sed 's/^.*\.\([^.]*\)$/\1/' 

    Utilizzo quindi il seguente command per get un elenco di estensioni in un dir:

     find . -type f | sed 's/^.*\.\([^.]*\)$/\1/' | sort | uniq -c | sort -n 

    È inoltre ansible utilizzare taglio come questo:

     for file in /a/dir/*/dir/* ; do echo \`echo $file | cut -d"." -f 1` >> textfile; done 

    Funzionerà solo se non si dispone di file o directory con un "." nel nome

    Hai dato una definizione esplicita per le estensioni,
    Ma i tag linux e bash-scripting suggeriscono un ambiente unix.
    A less che non lo fai con Cygwin su Windows.
    Questi punti potrebbero non imporsi in quel caso …

    • Assicurati di non avere numbers nella tua 'estensione' (come md5 )
    • Inoltre, quanto alle estensioni con less di 3 caratteri? ( script.sh )
    • E le estensioni con caratteri maiuscoli?
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.