2009-07-25 17 views
8

Jestem nowy w sed, i potrzebuję chwycić tylko nazwę pliku od wyjścia find. Potrzebuję znaleźć wyjściową całą ścieżkę dla innej części mojego skryptu, ale chcę wydrukować nazwę pliku bez ścieżki. Muszę również dopasować zaczynając od początku linii, a nie od końca. Po angielsku, chcę dopasować pierwszą grupę znaków kończącą się ".txt" niezawierającą "/". Oto moja próba, która nie działa:Używanie sed do pobrania nazwy pliku z pełnej ścieżki?

[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 

oto wyjście chcę:

two.txt 
one.txt 

Ok, więc rozwiązania oferowane odpowiedział na moje pierwotne pytanie, ale myślę, że poprosił go źle. Nie chcę zabijać reszty linii poza sufiksem pliku, którego szukam. Tak więc, aby być bardziej jasne, jeśli następuje:

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' 

Co chcę jest:

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

Przepraszamy za zamieszanie. Moje oryginalne pytanie dotyczyło tylko pierwszej części tego, co próbuję zrobić.

2-ty edit: oto co mam wymyślić:

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

To nie jest całkiem to, czego chcę, choć. Zamiast ustawiania katalogu docelowego jako zmiennej powłoki, chciałbym zmienić pierwszą operację sed, aby zmieniała tylko dane wyjściowe cp przed "->" w każdym wierszu, dzięki czemu nadal będę mieć drugą część danych wyjściowych cp działają z innym "-e".

3-ty edit: I nie zorientowali to jeszcze tylko przy użyciu sed regex, ale następujące spełnia swoje zadanie przy użyciu Perl:

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

Chciałbym to zrobić w sed chociaż.

Odpowiedz

7

Coś jak to powinno załatwić sprawę:

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

lub nieco jaśniejszy,

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

Dlaczego zamiast tego nie używasz systemu bazowego?

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

I jego przyjaciel, dirname. Byłoby wspaniale, gdybyś pokazał działający przykład, który wykorzystuje szczegóły podane w pytaniu. –

+0

Nigdy nie słyszałem o basename i cieszę się, że wiem o tym teraz, ale miałem nadzieję na jakąś pomoc z sed regex. –

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

Nie potrzebują zewnętrznych narzędzi, jeśli za pomocą GNU znaleźć

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

Jak nie wiedziałem o tym?!? Jest to niezwykle przydatna funkcja. Dziękuję Ci! Izoluj katalogi za pomocą 'find/path -name" * .txt "-printf"% h \ n "' – whereisalext

-2
path="parentdir2/parentdir1/parentdir0/dir/FileName" 
    name=${path##/*} 
Powiązane problemy