2009-07-25 13 views
8

Sono nuovo per sed, e ho bisogno di prendere solo il nome del file dall'output di find. Ho bisogno di trovare l'output dell'intero percorso per un'altra parte del mio script, ma voglio solo stampare il nome del file senza il percorso. Devo anche abbinare lo a partire dall'inizio della linea, non dalla fine. In inglese, voglio abbinare, il primo gruppo di caratteri che termina con ".txt" che non contiene un "/". Ecco il mio tentativo che non funziona:Utilizzare sed per prelevare il nome file dal percorso completo?

[email protected]:~$ find /home/ryan/Desktop/test/ -type f -name \*.txt 
/home/ryan/Desktop/test/two.txt 
/home/ryan/Desktop/test/one.txt 
[email protected]:~$ find /home/ryan/Desktop/test/ -type f -name \*.txt | sed s:^.*/[^*.txt]::g 
esktop/test/two.txt 
ne.txt 

Ecco l'output che voglio:

two.txt 
one.txt 

Ok, quindi le soluzioni offerte ha risposto alla mia domanda iniziale, ma credo che ho chiesto sbagliato. Non voglio uccidere il resto della riga oltre il suffisso del file che sto cercando. Così, per essere più chiari, se la seguente:

bash$ new_mp3s=\`find mp3Dir -type f -name \*.mp3\` && cp -rfv $new_mp3s dest 
`/mp3Dir/one.mp3' -> `/dest/one.mp3' 
`/mp3Dir/two.mp3' -> `/dest/two.mp3' 

Quello che voglio è:

bash$ new_mp3s=\`find mp3Dir -type f -name \*.mp3\` && cp -rfv $new_mp3s dest | sed ??? 
`one.mp3' -> `/dest' 
`two.mp3' -> `/dest' 

Ci scusiamo per la confusione. La mia domanda iniziale riguardava solo la prima parte di ciò che sto cercando di fare.

secondo edit: qui è quello che è venuta in mente:

DEST=/tmp && cp -rfv `find /mp3Dir -type f -name \*.mp3` $DEST | sed -e 's:[^\`].*/::' -e "s:$: -> $DEST:" 

Questo non è proprio quello che voglio però. Invece di impostare la directory di destinazione come variabile di shell, vorrei modificare la prima operazione sed in modo che cambi solo l'output cp prima di "->" su ogni riga, così ho ancora la seconda parte dell'output cp operare con un altro '-e'.

3 ° edit: non ho solo sed di espressione regolare ancora capito questo fuori uso, ma il seguente fa il lavoro utilizzando Perl:

cp -rfv `find /mp3Dir -type f -name \*.mp3` /tmp | perl -pe "s:.*/(.*.mp3).*\`(.*/).*.mp3\'$:\$1 -> \$2:" 

mi piacerebbe farlo in sed però.

risposta

7

Qualcosa del genere dovrebbe fare il trucco:

find yourdir -type f -name \*.txt | sed 's/.*\///' 

o, un po 'più chiaro,

find yourdir -type f -name \*.txt | sed 's:.*/::' 
15

Perché non si usa invece il nome di base?

find /mydir | xargs -I{} basename {} 
+1

E il suo amico, nome. Sarebbe bello se mostrassi un esempio funzionante che usa i dettagli forniti nella domanda. –

+0

Non avevo mai sentito parlare di basename, e sono contento di sapere adesso, ma speravo in qualche aiuto di regex. –

0
find /mydir | awk -F'/' '{print $NF}' 
8

Nessun bisogno di strumenti esterni se si utilizza GNU trovare

find /path -name "*.txt" -printf "%f\n" 
+0

Come non sapevo di questo?!? Questa è una caratteristica incredibilmente utile da sapere. Grazie! Isolare le directory con 'find/path -name" * .txt "-printf"% h \ n "' – whereisalext

-2
path="parentdir2/parentdir1/parentdir0/dir/FileName" 
    name=${path##/*} 
Problemi correlati