Я хотел удалить все расширения .sh, поэтому сделал это:
ls *.sh | xargs -I {} mv {} `basename {} .sh`
Однако это не работает, оно ведет себя как basename
возвращает неизменное имя файла.
Почему так себя ведет?
Например, это работает:
ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`;
РЕДАКТИРОВАТЬ :
Решение: одинарная кавычка предотвращает `basename ...`
оценку оболочкой до запуска команды.
ls *.sh | xargs -I {} sh -c 'mv {} `basename {} .sh`'
bash
text-processing
xargs
majkinetor
источник
источник
-i
опции, но эти «классические» опции устарели. Например, чтобы использовать только одну опцию / строку, рекомендуется новая справочная страница POSIX-L1
. Чтобы вызвать старое поведение-i
, страница рекомендует эту-I'{}'
опцию.rename
, например:rename 's/\.sh//' *.sh
. Попробуйте сначала с сухим прогоном (-n
).rename
работает отлично и довольно просто, но помните, что это очень специфично для дистрибутива. Дистрибутивы, основанные на RHEL и Debian, предоставляют разныеrename
команды, поэтому об этом следует помнить при создании кросс-дистрибутивных скриптов.Я не уверен в вашем вопросе, вы на самом деле спрашиваете, почему ваша первая строка не работает? Или вы ищете правильный способ переименовать все файлы .sh?
Предполагая, что это самый чистый метод, я предпочитаю подготовить параметры команд раньше
xargs
. Для удаления расширения .sh я часто рассматриваю этот подход,источник