Вам нужно сделать две вещи:
1 )файлов в source
не вtarget
:
mv -n "$source"/* $target
-n
предотвращает перезапись, если цель существует, поэтому вы копируете все, а mv -n
проверит существование за вас
2 )файла в target
с идентичным файлом в source
, удалить файл вsource
for tgt in $target/* ; do src="$source"/$(basename "$f") ; cmp "$tgt" "$src" && rm "$src" ; done
cmp
возвращает 0 (true, для bash ), если файлы идентичны, 1 (false ), если они разные, поэтому bash оценивает только первый член &&, если он ложен(false && anything
is всегда false )и не будет выполнять rm
, если файлы разные.
Возможно
tail -f /tmp/test | sed "s/['\"]//g" | while read line; do
do_something "$line"
done
И проверьте это:https://stackoverflow.com/questions/199266/make-xargs-execute-the-command-once-for-each-line-of-input
Есть несколько вещей.
Первый :"хвост -f" никогда не завершится, поэтому "xargs" также будет работать бесконечно. Вы можете открыть второе окно, чтобы «убить -HUP» процесс «tail -f», чтобы завершить как «tail -f», так и «xargs», и, таким образом, произвести вывод.
Второй :«xargs» буферизует ввод и не получает то, что он считает «полным буфером», поэтому к моменту вывода 1000-секундных отметок он еще не выполнил команду echo даже однажды. Если вы хотите, чтобы «xargs» запускал эхо отдельно для каждой входной строки, вам нужно добавить параметр «-n 1» в xargs.
Что касается «xargs», которому не нравятся одинарные кавычки, вы можете использовать опцию «-d '\n'», чтобы отключить обработку кавычек и разделять входные аргументы только новой строкой.