Беги, расширяй поиск результатов
Я пытаюсь запустить команду расширения оболочки для всех файлов, найденных 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 ответа
Ваша команда не работает по двум причинам.
- Перенаправление вывода выполняется оболочкой, а не
find
, Это означает, что оболочка будет перенаправлятьfind
вывод в файл{}
, - Перенаправление произойдет немедленно. Это означает, что файл будет записан еще до того, как он будет прочитан
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'