Почему эта команда 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 
  • рекурсивно chmod
  • Пропустить флаги для xargs
  • Расширение оболочки оболочки Ubuntu - путаница с командой sox
  • Как рассказать xargs, какой аргумент выбрать?
  • Как я могу создать файл, который я получил из stdin без xargs
  • Использование xargs для генерации ссылок
  • Что делает «-t» в команде mv? Пример ниже
  • xargs -r0 vs xargs -0
  • Почему «{}» и «%» обычно используются как переменные в xargs?
  • Правильно избегая выхода из трубы в xargs
  • Как распределить вычисления «tar czf» в течение длительного времени?
  • Interesting Posts

    Заменить рабочий каталог на 2 терминала одновременно

    найти и заменить sed с помощью косой черты в поиске и замене строки

    Диспетчер Mint Display Manager говорит «g_key_file_free: assertion» key_file! NULL не удалось "после того, как я перестроил glib

    Как иметь один IP-адрес с несколькими серверами

    find / grep выводит две строки для каждого найденного файла

    Linux Mint 14.1 с Cinnamon – Чувствительность мыши не работает

    Как найти значение из выражения

    установить BIND9 AS Источник RPM

    Как я могу встроить вывод консольного приложения в рабочий стол X11?

    mutt: сохранить сообщение в определенной папке

    Смотреть / tmp для создания файлов и предотвращения удаления файлов?

    Проблемы с nmap-сканированием с использованием прокси-сервера ssh с proxychains

    Жесткие диски пропадают без перезагрузки – что может быть причиной?

    Как изменить конфигурацию hotspot для Network Manager?

    Есть ли разница между этими двумя параметрами конфигурации?

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