Вы не можете использовать escape \
в цитате ''
. Поэтому поместите все в цитату ""
и экранируйте "
сегмент " s / ^ \ "'/' / g"
В качестве альтернативы завершите ' '
цитата, введите \'
, затем снова начните цитату ''
, например 's / ^ "' \ '' / '\' '/ g'
Также, если вас легко сбивают с толку \
s и /
s, тогда обратите внимание, что вам не обязательно использовать /
s в качестве разделителей. Вы можете использовать любой символ, например "s% ^ \" '%'% g "
Это только первая кавычка в начало строки, бит, с которым вы, кажется, боретесь.
find
+bash
раствор:
find /log -type f -name "*.1" -exec bash -c 'gzip -nc "$1" > "${1:0:-2}.gz"; rm "$1"' _ {} \;
gzip
опции:
-n
-при сжатии не сохранять оригинальное имя файла и отметку времени по умолчанию -c
-запись вывода на стандартный вывод; оставить исходные файлы без изменений ${1:0:-2}
-bash
's нарезка ; получить путь к файлу с усеченными последними 2 символами
Вы можете сделать что-то вроде:
find /log -name '*.1' -type f -exec sh -c '
for file do
gzip "$file" && mv -i "$file.gz" "${file%.*}.gz"
done' sh {} +
Мы используем gzip file && mv -i file.gz newfile
вместо gzip < file > newfile && rm -f file
, чтобы извлечь выгоду из способности gzip
сохранять некоторые метаданные в сжатом файле и для лучшей способности mv -i
справляться с конфликтами.