Беги, расширяй поиск результатов

Я пытаюсь запустить команду расширения оболочки для всех файлов, найденных find команда. Я пробовал -exec и xargs, но оба не удалось. Может кто-нибудь объяснить мне, почему? Я на Mac для записи.


find . -name "*.php" -exec expand -t 4 {} > {} \;

Это просто создает файл {} со всеми выходными данными вместо перезаписи каждого найденного файла.


find . -name "*.php" -print0 | xargs -0 -I expand -t 4 {} > {}

И это только выводы

4 {}
xargs: 4: No such file or directory

2 ответа

Решение

Ваша команда не работает по двум причинам.

  1. Перенаправление вывода выполняется оболочкой, а не find, Это означает, что оболочка будет перенаправлять findвывод в файл {},
  2. Перенаправление произойдет немедленно. Это означает, что файл будет записан еще до того, как он будет прочитан expand команда. Поэтому невозможно перенаправить вывод команды во входной файл.

к несчастью expand не позволяет записать его вывод в файл. Таким образом, вы должны использовать перенаправление вывода. Если вы используете bash Вы могли бы определить function который выполняет expand, перенаправляет вывод во временный файл и перемещает временный файл обратно в исходный файл. Проблема в том, что find запустит новую оболочку для выполнения expand команда.

Но есть решение:

expand_func () {
  expand -t 4 "$1" > "$1.tmp"
  mv "$1.tmp" "$1"
}

export -f expand_func

find . -name \*.php -exec bash -c 'expand_func {}' \;

Вы экспортируете функцию expand_func к субоболочкам используя export -f, И ты не казнишь expand сам с помощью find -exec но вы выполняете новый bash который выполняет экспортированный expand_func,

"Расширение" на самом деле не стоит проблем. Вы можете просто использовать sed вместо:

find . -name "*.php" | xargs sed -i -e 's/\t/    /g'
Другие вопросы по тегам