Skocz do zawartości
Fizyda

Bash nazwy plików z konkretnej lokalizacji o danym rozszerzeniu

Polecane posty

Mógłby mi ktoś pomóc zrobić we wspaniałym bashu taką magię jaką jest pobranie listy plików z podanej lokalizacji o konkretnym rozszerzeniu i zapisanie samych nazw do tablicy.

 

Udało mi się wyskrobać coś takiego:

MYARR=()

[...]

for i in "`ls $DIR | grep .cos`"; do
    MYARR+=("$i")
done

i za żadne skarby nie mogę wyciąć z $i końcówki '.cos'.

 

Jakby mi ktoś powiedział, że godzinę czasu spędzę pisząc taką pierdołę to bym go wyśmiał. Zastanawiam się czy nie łatwiej byłoby to napisać w C/C++ lub w moim ulubieńcu pythonie.

 

Próbowałem czegoś takiego do wycięcia końcówki:

tmp="$i"
tmp=${{tmp}%".signed"}

MYARR+=("$tmp")

Ale jakimś cudem działa tylko na drugi (z dwóch) plików.

Edytowano przez Fizyda (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Spoofy

Wycięte z mojego rndc-helper'a :

  SLAVE_ZONES_LIST=`ls -1 * | sed 's/.signed//g'`
  for zone in $SLAVE_ZONES_LIST; do
    echo $zone
  done

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Wy to sobie umiecie utrudniać życie :D.

 

 

find /path/to/gdziestam -type f -name "*.txt" | cut -d '.' -f 1 > wynik.txt

 

Chociaż jak chcesz zrobić wersję reliable gdzie kropka może występować częściej niż raz to powinieneś zrobić:

 

 

find /path/to/gdziestam -type f -name "*.txt" | rev | cut -d '.' -f 2- | rev > wynik.txt

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dzięki za odpowiedzi, niestety

 

 

Wycięte z mojego rndc-helper'a :

  SLAVE_ZONES_LIST=`ls -1 * | sed 's/.signed//g'`
  for zone in $SLAVE_ZONES_LIST; do
    echo $zone
  done

Nie załatwia sprawy ponieważ mam nazwy wszystkich plików w katalogu

 

 

 

Wy to sobie umiecie utrudniać życie :D.

find /path/to/gdziestam -type f -name "*.txt" | cut -d '.' -f 1 > wynik.txt

Chociaż jak chcesz zrobić wersję reliable gdzie kropka może występować częściej niż raz to powinieneś zrobić:

find /path/to/gdziestam -type f -name "*.txt" | rev | cut -d '.' -f 2- | rev > wynik.txt

Prawie, problem w tym że mam całą ścieżkę, ja potrzebuję samą nazwę ponieważ jest ona wartością którą muszę użyć w skrypcie. Powiem szczerze nic nie rozumiem z Twojej komendy więc nie wiem czy mój sposób to jest utrudnianie życia :D.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  SLAVE_ZONES_LIST=`ls -1 * | sed 's/.signed//g'`
  for zone in $SLAVE_ZONES_LIST; do
    echo $zone
  done

W tym kodzie w pierwszej linijce zamień '*' na '*.cos'

 

find /path/to/gdziestam -type f -name "*.txt" | cut -d '.' -f 1 > wynik.txt
find /path/to/gdziestam -type f -name "*.txt" | rev | cut -d '.' -f 2- | rev > wynik.txt

Tutaj dodaj '-exec basename', czyli:

 

find /path/to/gdziestam -type f -exec basename -name "*.txt" | cut -d '.' -f 1 > wynik.txt

find /path/to/gdziestam -type f -exec basename -name "*.txt" | rev | cut -d '.' -f 2- | rev > wynik.txt

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Udało mi się osiągnąć efekt jaki oczekiwałem do tego w sposób który rozumiem (@Archi ;)), dlatego zostawiam to dla potomnych:

myfiles=($(ls $DIR | grep .ext))

for myfile in "${myfiles[@]}"; do
    filename=(${myfile%.ext})
done

Krótki opis linijka po linijce:
1. Przechwycenie listy plików z podanej lokalizacji w zmiennej DIR i wygrepowanie ich po interesującym rozszerzeniu. Z takich informacji budujemy tablice o nazwie myfiles
3. Pętla (foreach) po każdym elemencie z naszej tablicy
4. Usuwamy przy pomocy manipulation string z końca stringu którym jest cała nazwa naszego pliku najmniejsze dopasowanie dla wyrażenia zapisanego po '%' czyli w naszym przypadku na sztywno wpisane rozszerzenie. Zapamiętujemy nazwę w zmiennej i możemy wykorzystać dalej w pętli.

 

Mam nadzieję że komuś się też przyda i zaoszczędzę mu masę czasu i nerwów ;).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się


×