Jestem bardzo nowa, więc bash więc proszęnadmiernie skomplikuj odpowiedź! Mam około 200 podkatalogów, z których każdy ma nazwę podobną do tej. (Myślę, że są to podkatalogi. Żyją przynajmniej w innym katalogu.)
XMMXCS J083454.8+553420.58
Muszę zbiorczo zmienić nazwę wszystkich tych katalogów i zmienić „+” w nazwie katalogu na „-”.
Aby zmienić nazwy mojego katalogu, spróbowałem:
find . -depth -type d -name + -exec sh -c "mv "${0}" "${0%/+}/-"" {} ;
i
find . -name + -type d -execdir mv {} -
Myślę jednak, że to nie działa, ponieważ + i- aren "t litery znaków. Jak to obejść? Wszystko, co znalazłem w Internecie, dotyczy zmiany nazwy plików w przeciwieństwie do katalogów, a jeśli ktoś wie, jak obejść to bez konieczności ręcznego zmieniania ich nazw, byłoby to bardzo mile widziane.
To poprzednie pytanie, które próbowałem i składnia nie działa dla mnie. Foldery są nazywane po uruchomieniu tym samym. Zmień nazwę wielu katalogów pasujących do wzorca
Dzięki
Odpowiedzi:
0 dla odpowiedzi № 1Możesz mieć taki skrypt.
#!/bin/bash
DIR="." ## Change to the directory you want.
for SDIR in "$DIR"/*; do
[[ -d $SDIR ]] || continue ## Skip if it"s not a directory
BASE=${SDIR##*/} ## Gets the base filename (removes directory part)
NEW_NAME=${BASE//+/-} ## Creates a new name based from $BASE with + chars changed to -
echo mv -- "$SDIR" "$DIR/$NEW_NAME" ## Rename. Remove echo if you think it works the right way already.
done
Następnie uruchomić bash script.sh
.
0 dla odpowiedzi nr 2
Twoja oryginalna składnia była dość bliska, spróbuj czegoś takiego
find -mindepth 1 -maxdepth 1 -type d -name "*+*" -exec bash -c "mv "${0}" "${0//+/-}"" {} ;
Zagadnienia
-depth
Wykonuje przejście dfs, ale wygląda na to, że chcesz tylko katalogów o głębokości jednego poziomu- Musisz dopasować globusy, które zawierają
+
. Więc*+*
i nie tylko+
(cytowanie jest potrzebne z globami, aby były przetwarzane przez find, a nie przez powłokę) - Z
"${0%/+}/-"
wydajesz się mieszać kilka składni,${0//SUBSTRING/TO_REPLACE}
z zastąpieniem wszystkich wystąpieńSUBSTRING
zTO_REPLACE