Да, find ./work -print0 | xargs -0 rm
выполнит что-то как rm ./work/a "work/b c" ...
. Можно свериться echo
, find ./work -print0 | xargs -0 echo rm
распечатает команду, которая будет выполняться (кроме пробела, будет оставлен соответственно, хотя echo
не покажет это).
Добираться xargs
чтобы поставить имена в середине, необходимо добавить -I[string]
, где [string]
то, что Вы хотите быть замененными аргументом, в этом случае Вы использовали бы -I{}
, например. <strings.txt xargs -I{} grep {} directory/*
.
То, что Вы на самом деле хотите использовать, grep -F -f strings.txt
:
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file
contains zero patterns, and therefore matches nothing. (-f is
specified by POSIX.)
Так grep -Ff strings.txt subdirectory/*
найдет все случаи любой строки в strings.txt
как литерал, если Вы отбрасываете -F
опция можно использовать регулярные выражения в файле. Вы могли на самом деле использовать grep -F "$(<strings.txt)" directory/*
также. Если Вы хотите практиковать find
, можно использовать последние два примера в сводке. Если Вы хотите сделать рекурсивный поиск вместо просто первого уровня, у Вас есть несколько опций, также в сводке.
Сводка:
# grep for each string individually.
<strings.txt xargs -I{} grep {} directory/*
# grep once for everything
grep -Ff strings.txt subdirectory/*
grep -F "$(<strings.txt)" directory/*
# Same, using file
find subdirectory -maxdepth 1 -type f -exec grep -Ff strings.txt {} +
find subdirectory -maxdepth 1 -type f -print0 | xargs -0 grep -Ff strings.txt
# Recursively
grep -rFf strings.txt subdirectory
find subdirectory -type f -exec grep -Ff strings.txt {} +
find subdirectory -type f -print0 | xargs -0 grep -Ff strings.txt
Можно хотеть использовать -l
опция получить просто название каждого файла соответствия, если Вы не должны видеть фактическую строку:
-l, --files-with-matches
Suppress normal output; instead print the name of each input
file from which output would normally have been printed. The
scanning will stop on the first match. (-l is specified by
POSIX.)
Проблема состоит в том, что Вы используете обоих &
и ;
вместе. Они - и разделители команды и не могут использоваться одновременно. Вот Ваш зафиксированный пример:
( cd /opt/myprogram && ./myprocess.sh >/dev/null 2>&1 & disown )
nohup утилита была разработана для в значительной степени, что Вы ищете:
Usage: nohup COMMAND [ARG]...
or: nohup OPTION
Run COMMAND, ignoring hangup signals.
If standard input is a terminal, redirect it from /dev/null.
If standard output is a terminal, append output to 'nohup.out' if possible,
'$HOME/nohup.out' otherwise.
If standard error is a terminal, redirect it to standard output.
To save output to FILE, use 'nohup COMMAND > FILE'.