Когда вы нажимаете enter, оболочка сначала обрабатывает любые перенаправления, в данном случае > {}
. Это происходит до того, как оболочка создаст процесс для find
, так как ему необходимо подключить выход процесса find
к {}
. Это означает, что вы должны найти файл {}
в текущей папке.
Я думаю, что вы лучше с петлей в этом случае:
find . -type f -print0 | while IFS= read -r -d $'\0' file
do
awk ... "$file" > "$file"
done
но есть загвоздка: Опять же, оболочка будет сначала сделать перенаправление. Это означает, что он создаст пустой$file
в качестве вывода для awk
, а затем запустится awk
, после чего начнется чтение указанного пустого файла. Более простым способом добиться того же самого было бы echo -n > "$file"
.
Так что вам действительно нужно писать во временный файл, а затем переименовать:
find . -type f -print0 | while IFS= read -r -d $'\0' file
do
awk ... "$file" > "$file.tmp" && mv "$file.tmp" "$file"
done
И убедитесь, что у вас есть резервная копия всего, прежде чем выполнить команду, потому что он может пойти наперекосяк. Например, если у вас есть скрытая папка из вашего контроля версий, find
войдет туда, и awk
уничтожит несколько важных бит.
PS: Если вы используете IDE, включите регулярные выражения и выполните поиск #pragma mark -\n#pragma mark Getters
. Теперь вы можете заменить две строки на одну, и ваша IDE сделает 95% уверенным, что строка не будет заменена в местах, где вы не хотите, чтобы это произошло.
Вы не можете 'awk file> file' (то, что вы используете, не имеет значения), терминал обрезает выходной файл * немедленно *, поэтому ваша команда никогда не видит содержимого файла. –
@EtanReisner Спасибо за этот намек. Поскольку я полный новичок в магической магии, я не знаю, как обойти эту проблему. – Bastian
Вы работаете с одним файлом и выходите на другой, а затем переместите новый файл поверх старого файла. –