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`'
-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ę.