2011-12-15 13 views
35

ls /home/user/new/*.txt stampa tutti i file txt in quella directory. Tuttavia stampa l'output come segue:Per mostrare solo il nome del file senza l'intero percorso di directory

[[email protected]]$ ls /home/user/new/*.txt 
/home/user/new/file1.txt /home/user/new/file2.txt /home/user/new/file3.txt 

e così via.

voglio eseguire il comando ls non dalla directory /home/user/new/ quindi devo dare il nome completo della directory, ma voglio l'uscita di essere solo come

[[email protected]]$ ls /home/user/new/*.txt 
file1.txt file2.txt file3.txt 

Non voglio l'intero percorso . È necessario solo il nome del file. Questi problemi devono essere risolti usando il comando ls, poiché il suo output è pensato per un altro programma.

+0

Quale sistema operativo? Ad esempio, OS X fa ciò che vuoi già. Sei sicuro che non sia alias? –

risposta

60

ls whateveryouwant | xargs -n 1 basename

fa questo lavoro per voi?

Altrimenti si può (cd /the/directory && ls) (sì, parentesi intended)

+0

Sì, ha funzionato. Grazie mille. – Ashish

+2

Probabilmente dovresti usare 'ls -d' nel caso in cui' whateveryouwant' si riferisce a più directory. –

+3

Nota che se il percorso contiene spazi, gli xargs si romperanno su di essi. Devi invece usare 'xargs -d '\ n' -n 1'. – Zitrax

7

ci sono diversi modi per raggiungere questo obiettivo. Uno potrebbe essere qualcosa di simile:

for filepath in /path/to/dir/* 
do 
    filename=$(basename $file) 

    ... whatever you want to do with the file here 
done 
4

si potrebbe aggiungere uno script sed alla riga di comando:

ls /home/user/new/*.txt | sed -r 's/^.+\///' 
1

preferisco il nome di base che è già risposto da FGE. Un altro modo è:

ls /home/user/new/*.txt|awk -F"/" '{print $NF}' 

un modo in più brutta è:

ls /home/user/new/*.txt| perl -pe 's/\//\n/g'|tail -1 
4

Un modo elegante per risolverlo è quello di utilizzare due volte "rev" e "tagliare":

find ./ -name "*.txt" | rev | cut -d '/' -f1 | rev 
29

Non c'è bisogno di Xargs e di tutti, ls è più che sufficiente.

ls -1 *.txt 

display fila saggio

+8

Questo non è corretto se si legge attentamente OP. Funziona solo se sei in quella directory. –

+0

Funziona perfettamente! Grazie a @VRVigneshwara! 'ls -1 bin /' elenca le voci all'interno di bin/directory senza percorso su Linux Debian. –

0

solo sperando di essere d'aiuto a qualcuno come vecchi problemi sembrano tornare di tanto in tanto e ho sempre trovato buoni consigli qui.

Il mio problema era elencare in un file di testo tutti i nomi dei file "* .txt" in una determinata directory senza percorso e senza estensione da una sequenza Datastage 7.5.

La soluzione che abbiamo usato è:

ls /home/user/new/*.txt | xargs -n 1 basename | cut -d '.' -f1 > name_list.txt 
2

(cd dir ; ls)

sarà soltanto i nomi di uscita in dir. Utilizzare ls -1 se si desidera uno per riga.