Forum Linux.pl

Dystrybucje Linuksa => *Ubuntu => Wątek zaczęty przez: huzar w 2016-11-08, 20:11:25

Tytuł: Komenda Terminal
Wiadomość wysłana przez: huzar w 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.
Tytuł: Odp: Komenda Terminal
Wiadomość wysłana przez: Paweł Kraszewski w 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).
Tytuł: Odp: Komenda Terminal
Wiadomość wysłana przez: huzar w 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.
Tytuł: Odp: Komenda Terminal
Wiadomość wysłana przez: 1709 w 2016-11-09, 21:14:12
Edytowane:
Przepraszam , zły przyklad podalem.
Tytuł: Odp: Komenda Terminal
Wiadomość wysłana przez: huzar w 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.
Tytuł: Odp: Komenda Terminal
Wiadomość wysłana przez: Paweł Kraszewski w 2016-11-09, 22:33:08
To teraz czas usiąść do manuala (http://www.tutorialspoint.com/perl/perl_regular_expression.htm) do regexpów PERLa. Pierwsze z brzegu: kropka w regexpie oznacza 'dowolny jeden znak'. Jak chcesz szukać dosłownej kropki, to musisz użyć \.
Tytuł: Odp: Komenda Terminal
Wiadomość wysłana przez: 1709 w 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
Tytuł: Odp: Komenda Terminal
Wiadomość wysłana przez: huzar w 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.
Tytuł: Odp: Komenda Terminal
Wiadomość wysłana przez: 1709 w 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.