2009-07-25 91 views
8

我是新來的sed,需要抓取find的輸出文件名。我需要爲我的腳本的另一部分查找輸出的完整路徑,但我只想打印沒有路徑的文件名。我也需要匹配從行開始開始,而不是從最後開始。在英文中,我想匹配第一組以「.txt」結尾且不包含「/」的字符。這是我嘗試不工作:使用sed從完整路徑抓取文件名?

[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 

這是我想要的輸出:

two.txt 
one.txt 

好了,所以提供的解決方案回答我原來的問題,但我想我問它錯了。我不想殺掉通過我正在搜索的文件後綴的行的其餘部分。 所以,爲了更清楚,如果以下:

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' 

我要的是:

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

很抱歉的混亂。我原來的問題剛剛涵蓋了我想要做的第一部分。

2日編輯: 這裏就是我想出來的:

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

這不是完全是我想雖然。我不想將目標目錄設置爲shell變量,而是想要更改第一個sed操作,以便它僅在每行上的「 - >」之前更改cp輸出,以便我仍然將cp輸出的第二部分輸出爲與另一個'-e'一起操作。

3日編輯: 使用我還沒有想通了這一點只有SED正則表達式的還,但下面不會使用Perl的作業:

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

我想做到這一點在SED雖然。

回答

7

像這樣的東西應該做的伎倆:

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

,或者稍微更清晰,

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

爲什麼不使用basename呢?

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

和它的朋友,dirname。如果您展示了一個使用問題中提供的詳細信息的工作示例,那將會很棒。 – 2009-07-25 02:32:06

+0

我從來沒有聽說過基地名稱,我很高興我現在知道它,但我希望有一些sed正則表達式的幫助。 – 2009-07-25 04:47:17

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

無需外部工具,如果使用GNU發現

find /path -name "*.txt" -printf "%f\n" 
-2
path="parentdir2/parentdir1/parentdir0/dir/FileName" 
    name=${path##/*}