Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Komenda Terminal  (Przeczytany 3279 razy)

huzar

  • Gość
Komenda Terminal
« dnia: 2016-11-08, 20:11:25 »
Witam.
Mam pytanie, wykonuje w terminalu polecenie

find . -type d -exec rename 's/AC3//g' {};


Po czym wychodzi mi:
find: brak argumentu dla `-exec'

Nie wiem za bardzo dlaczego mi nie chce to działać chce z tego zrobić sobie skrypt w bash po większej rozbudowie tego. Żeby mi wyszukiwało pliki i katalogi i zmieniało nazwy tych katalogów i plików głowie chodzi mi o usuwanie nie chcianych wyrażeń w nazwach które właśnie chce wprowadzić w skrypt.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: Komenda Terminal
« Odpowiedź #1 dnia: 2016-11-08, 21:57:27 »
find . -type d -exec rename 's/AC3//g' "{}" \;

1. Złapka {} powinna być w cudzysłowie - żeby uniknąć niespodzianek przy nazwach ze spacjami.
2. Przed średnikiem powinien być backslash (to bezpośrednia przyczyna błędu).
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

huzar

  • Gość
Odp: Komenda Terminal
« Odpowiedź #2 dnia: 2016-11-09, 19:27:17 »
Dziękuję za odpowiedź wrócę tylko do domu to sprawdzę czy mi to zadziała.

Działa ale nie do końca jak bym chciał nie zmienia mi tak jak bym tego oczekiwał.
A jak dałem żeby za kropkę zrobiło spacje to mi wykasowało całą nazwę katalogu.
« Ostatnia zmiana: 2016-11-09, 20:56:51 wysłana przez huzar »

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2763
  • 1709
    • Zobacz profil
Odp: Komenda Terminal
« Odpowiedź #3 dnia: 2016-11-09, 21:14:12 »
Edytowane:
Przepraszam , zły przyklad podalem.
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

huzar

  • Gość
Odp: Komenda Terminal
« Odpowiedź #4 dnia: 2016-11-09, 21:29:57 »
A jak można inaczej zapisać ten kod:
find . -type d -exec rename 's/AC3//g' "{}" \;

Tak żeby zmieniał tylko całe wyrażenie jakie mnie interesuje

np:
find . -type d -exec rename 's/www.blblbl.pl//g' "{}" \;

Chodzi mi o to żeby tylko wywalilo to "www.blblbl.pl" i zmieniło na puste pole. Bo jak po prostu uruchomię tak jak napisane to mi się sypie cała nazwa katalogu.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: Komenda Terminal
« Odpowiedź #5 dnia: 2016-11-09, 22:33:08 »
To teraz czas usiąść do manuala do regexpów PERLa. Pierwsze z brzegu: kropka w regexpie oznacza 'dowolny jeden znak'. Jak chcesz szukać dosłownej kropki, to musisz użyć \.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2763
  • 1709
    • Zobacz profil
Odp: Komenda Terminal
« Odpowiedź #6 dnia: 2016-11-09, 22:48:52 »
Ja zrobiłem tak
ab1a1=$(find . -maxdepth 1 -type d -name "*.*" )
ab1a2=$(find . -maxdepth 1 -type d -name "*.*" | wc -l)

if [ "$ab1a2" -gt "0" ] ; then
for i in `seq 1 "$ab1a2"` ;do
echo "$i"
folder=$(awk 'NR=='$i <<< "$ab1a1" | cut -d"/" -f2)
echo $folder
nowy=$(echo "$folder" | sed 's/\./ /g')
echo "Renamed folder:" | tee -a rename.log
mv -v "$folder" "$nowy" | tee -a rename.log
done
fi

Wyjaśnienie:
-maxdepth 1 -> na własne potrzeby dodałem, wyszukuje tylko w pierwszym poziomie katalogów , w podkatalogach już nie
  -name "*.*"  --> wyszukuje tylko pliki które w środku nazwy mają kropke
wc -l --> zlicza linie
cut -d"/" -f2 --> usuwa z  nazwy folderu dwa pierwsze znaki ( czyli . / )
sed 's/\./ /g' --> zamienia w nazwie kropkę na spację
tee -a rename.log --> zapisuje wynik polecenia do pliku
mv -v "$folder" "$nowy" --> zmienia nazwe folderu, opcja -v wyśletla informację przy zmianie nazwy
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

huzar

  • Gość
Odp: Komenda Terminal
« Odpowiedź #7 dnia: 2016-11-10, 10:18:20 »
Cytat:  link=topic=24740.msg133386#msg133386 date=1478728132
Ja zrobiłem tak
ab1a1=$(find . -maxdepth 1 -type d -name "*.*" )
ab1a2=$(find . -maxdepth 1 -type d -name "*.*" | wc -l)

if [ "$ab1a2" -gt "0" ] ; then
for i in `seq 1 "$ab1a2"` ;do
echo "$i"
folder=$(awk 'NR=='$i <<< "$ab1a1" | cut -d"/" -f2)
echo $folder
nowy=$(echo "$folder" | sed 's/\./ /g')
echo "Renamed folder:" | tee -a rename.log
mv -v "$folder" "$nowy" | tee -a rename.log
done
fi

Wyjaśnienie:
-maxdepth 1 -> na własne potrzeby dodałem, wyszukuje tylko w pierwszym poziomie katalogów , w podkatalogach już nie
  -name "*.*"  --> wyszukuje tylko pliki które w środku nazwy mają kropke
wc -l --> zlicza linie
cut -d"/" -f2 --> usuwa z  nazwy folderu dwa pierwsze znaki ( czyli . / )
sed 's/\./ /g' --> zamienia w nazwie kropkę na spację
tee -a rename.log --> zapisuje wynik polecenia do pliku
mv -v "$folder" "$nowy" --> zmienia nazwe folderu, opcja -v wyśletla informację przy zmianie nazwy


Super fajnie działa to zostaje mi teraz na bazie tego rozbudować to do innych wyrażeń.
I dodatkowo przerobić to pod pliki multimedialne.
Dziękuje za pomoc, proszę nie zamykać tematu bo jak będę miał jeszcze jakieś pytania lub problemy to będę pisał tutaj.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2763
  • 1709
    • Zobacz profil
Odp: Komenda Terminal
« Odpowiedź #8 dnia: 2016-11-10, 11:50:06 »
Małe sprostowanie, bo źle wyjaśniłem " cut "
Cytuj
cut -d"/" -f2 --> usuwa z  nazwy folderu dwa pierwsze znaki ( czyli . / )

Komenda daje taki efekt końcowy, ale w rzeczywistości tak nie pracuje
opcja "c" tak naprawde wycina znaki
można tak
$ echo "./nazwa.folderu" | cut -c 3-
nazwa.folderu
Co oznacza że ucieło 3 pierwsze znaki.

Natomiast ...
$ echo "./nazwa.folderu" | cut -d"/" -f2
nazwa.folderu
tutaj cut oddziela ciągi znakiem "/"  ( -d"/" )  i wyświetla tylko drugą część (-f2) za tym " / "

Założenie jest takie ukośniki w nazwach folderów są niedozwolone, więc ich nie będzie prócz w drugim znaku każdego wyszukania find, czyli
$ find . -maxdepth 1 -type d -name "*.*"
.
./nowy.katalog 2
./nowy.katalog
Wniosek jest taki że nie robi różnicy czy
 wytne dwa pierwsze znaki "  cut -c 3- "  ( trzy znaki w rzeczywistości )
czy wyświetle drugą część nazwy za ukośnikiem "cut -d"/" -f2" ,
efekt końcowy jest ten sam.

PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.