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.
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).
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.
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
Małe sprostowanie, bo źle wyjaśniłem " cut "
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.