Chciałem usunąć wszystkie rozszerzenia .sh, więc zrobiłem to:
ls *.sh | xargs -I {} mv {} `basename {} .sh`
Jednak to nie działa, zachowuje się jak basename
zwraca niezmienioną nazwę pliku.
Dlaczego tak się zachowuje?
Na przykład działa to:
ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`;
EDYCJA :
Rozwiązanie: pojedynczy cudzysłów zapobiega `basename ...`
ocenie przez powłokę przed uruchomieniem polecenia.
ls *.sh | xargs -I {} sh -c 'mv {} `basename {} .sh`'
bash
text-processing
xargs
majkinetor
źródło
źródło
-i
opcji, ale te „klasyczne” opcje zostały wycofane. Na przykład, aby użyć tylko jednej opcji / linii, nowa strona podręcznika POSIX zaleca-L1
. Aby wywołać stare zachowanie-i
, strona zaleca tę-I'{}'
opcję.rename
nprename 's/\.sh//' *.sh
. : Spróbuj najpierw z suchobiegiem (-n
).rename
działa świetnie i dość prosto, ale pamiętaj, że jest bardzo specyficzny dla dystrybucji. Dystrybucje oparte na RHEL i Debianie udostępniają różnerename
polecenia, dlatego należy o tym pamiętać podczas tworzenia skryptów między dystrybucjami.Nie jestem pewien co do twojego pytania, czy faktycznie pytasz, dlaczego pierwsza linia nie działa? A może szukasz odpowiedniej metody zmiany nazwy wszystkich plików .sh?
Zakładając, że jest to najczystsza metoda, wolę wcześniej przygotować opcje poleceń
xargs
. Aby usunąć rozszerzenie pliku .sh, często rozważam takie podejście,źródło