/ / Jak zmienić nazwę wielu katalogów w bashu za pomocą wzorca symboli - bash, katalog, znajdź, zmień nazwę

Jak zmienić nazwy wielu katalogów w bashu używając wzorca symbolu - bash, katalog, find, rename

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 № 1

Moż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 z TO_REPLACE