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)

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.