Почему эта команда xargs не работает?

Я хотел удалить все расширения .sh, так вот:

ls *.sh | xargs -I {} mv {} `basename {} .sh` 

Однако он не работает, он ведет себя так, как basename возвращает неизмененное имя файла.

  • Сообщение об ошибке на терминале, несмотря на использование символа 2>
  • Вход Bash в той же строке
  • Какую оболочку я должен использовать - tcsh vs bash?
  • Как процитировать строку, содержащую знак доллара $ и одинарную цитату '?
  • Запись содержимого из файла в другой файл с установленными временными интервалами с использованием разделителей
  • Экспортирование переменной среды
  • Почему это так?

    Например, это работает:

     ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`; 

    EDIT :

    Решение: одиночная кавычка предотвращает оценку `basename ...` » оболочкой перед запуском команды.

     ls *.sh | xargs -I {} sh -c 'mv {} `basename {} .sh`' 

  • Как искать доступные команды в bash
  • Почему bash очищает OLDPWD при запуске дочернего скрипта?
  • вывод технологического процесса на команду split by line и whitespace
  • Как я могу создать «базу» для других псевдонимов для ссылки на каталоги базы данных cd base / x?
  • Shell - работа с несколькими файлами истории команд
  • bash: cd к самому последнему модифицированному дочернему каталогу
  • 2 Solutions collect form web for “Почему эта команда xargs не работает?”

    Поскольку команда basename запускается до запуска конвейера. Для выполнения этой работы вам нужны xargs для выполнения basename, и вы можете сделать это с помощью sh -c , например:

     ls *.sh | xargs -L1 sh -c 'basename $1 .sh' dummy 

    Заметки:

    • Если вы не xargs куда вставлять имена файлов, они будут добавлены в конце командной строки.
    • Вы должны использовать ключ -L1 или его эквивалент, поэтому xargs передает только один аргумент sh .
    • Использование вывода ls может иметь нежелательные эффекты .

    редактировать

    Удалены устаревшие параметры, спасибо TechZilla

    Я не уверен в вашем вопросе, вы действительно спрашиваете, почему ваша первая строка не работает? Или вы ищете подходящий метод для переименования всех файлов .sh?

    Предполагая, что это самый чистый метод, я предпочитаю готовить параметры команд до xargs . Для удаления расширения файла .sh я часто рассматриваю этот подход,

      find -maxdepth 1 -type f -iname '*.sh' | sed 'p;s_.sh$__' | xargs -L2 mv 
    Linux и Unix - лучшая ОС в мире.