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

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

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

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

Почему это так?

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

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

EDIT :

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

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

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 
  • Странная ошибка «Нет такого файла» с «xargs» и «file»
  • найти . . * -тип f -print0 | xargs -0 sudo chmod 664; не работает
  • Linux: найдет | xargs grep имеют ограничения?
  • Преобразование строк новой строки в нуль-ограничение при использовании хвоста
  • Когда требуется xargs?
  • Передача нескольких аргументов в середине команды с помощью xargs
  • отобразить результаты поиска
  • Grep каталог и возвращаемый список с номерами строк
  • Как заставить «xargs» игнорировать выход ребенка и продолжить обработку
  • xargs - добавить каждый аргумент с параметром
  • Скопируйте файлы с родительской папкой в ​​новый каталог
  • Interesting Posts

    Как узнать, установлен ли пакет через yum в сценарии bash?

    Archlinux & openbox – greyish выиграть 95 приложений

    Bash – перенаправление вывода в переменную или файловый дескриптор, затем чтение из дескриптора переменной или файла

    md raid5: «нет действительного суперблока», но mdadm –examine говорит, что все в порядке

    Проблема с поврежденными пакетами

    Как перечислять в настоящее время не установленные пакеты?

    Mumble не привязывается к сетевому адресу при загрузке, его необходимо перезапустить (неправильно ли ждать сеть?)

    Команда для удаления первого N числа строк на входе

    Еще одна проблема с установкой Asterisk на kali linux

    свободный / верх разница. Есть ли бесплатная виртуальная память?

    Преобразование старого файла зоны DNS в новый формат

    Сервер NTP работает неправильно

    вторая клавиатура для запуска команд

    xpdf configure ПРЕДУПРЕЖДЕНИЕ – Не удалось найти Motif / X

    ssh на сервер, подключенный к службе VPN

    Linux и Unix - лучшая ОС в мире.