Попробуйте это решение. Работавший для меня:
sed -i 's/\$\$file_name.*/&V1/' foobar
где foobar
Ваш входной файл.
Для этого предикат -exec
:
find /some/path -type f -name file.pl -size +10M -exec perl /my/script.pl {} \;
Если вы хотите, чтобы ваша оболочка выполняла команды, основанные на выводе find
, то это должно быть bash
/zsh
специфично, если вы хотите быть надежным, как в:
zsh
:
IFS=$'\0'.
для f ($(найти /some/path -тип f -name file.pl -size +10M -print0)) {
/my/script.pl $f
}
, хотя в zsh
можно просто сделать:
для f (./**/file.pl(.LM+10)). /my/script.pl $f
bash
/zsh
while IFS= read -rd '' -u3 file; do
/my/script.pl "$файл"
сделано 3< <(find /some/path -type f -name file.pl -size +10M -print0)
Что бы вы ни делали, в bash
или других оболочках POSIX, избегайте:
for file in $(find...)
Или, по крайней мере, сделайте это менее плохо, исправив разделитель полей с новой строкой и отключив глобус:
IFS='
'; set -f; for file in $(find...)
(который все равно не будет работать для путей файлов, содержащих символы новой строки).
.Если вы пользуетесь инструментами GNU, должно также работать следующее:
find /some/path -type f -name file.pl -size +10M -print0 | xargs -0 -n 1 -r perl /my/script.pl
Объяснение:
-print0
заставляет GNU отделять имена файлов с помощью \0
байтов. Поскольку \0
байты не могут быть частью имени файла, это уникально разделяет имена файлов.-0
указывает GNU xargs читать стандартный входной сигнал как \0
-раздельный список имен файлов. -n 1
заставляет передавать вашему сценарию не более одного имени файла (если ваш сценарий может обрабатывать полный список файлов в качестве аргумента, просто пропустите это).-r
- это другое расширение GNU, которое не позволяет запускать вашу программу, если не предоставляются имена файлов.Это должно сработать
for path in `find /some/path -type f -name file.pl -size +10M`; do perl /my/script.pl $path ;done