zlib
реализует сжатие, используемое gzip, но не форматом файла. Вместо этого необходимо использовать gzip
модуль, который сам использует zlib
.
import gzip
s = '...'
with gzip.open('/tmp/data', 'w') as f:
f.write(s)
Если необходимо переименовать файлы в подкаталогах также и Вашем find
поддержки -execdir
предикат, затем можно сделать
find /search/path -depth -name '* *' \
-execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;
Благодарите @glenn jackman для предложения -depth
опция для find
и заставить меня думать.
Обратите внимание на это в некоторых системах (включая GNU/Linux), find
может не найти файлы, имя которых содержит пробелы и также последовательности байтов, которые не формируют допустимые символы (типичный с медиа-файлами с именами с символами неASCII, закодированными в наборе символов, отличающемся от локали). Установка локали к C
(как в LC_ALL=C find...
) решил бы проблему.
В любой оболочке можно циклично выполниться по файлам, имя которых содержит пространство. Замена пробелов с символами нижнего подчеркивания легка в ударе, ksh и zsh с ${VARIABLE//PATTERN/REPLACEMENT}
создать.
for x in *" "*; do
mv -- "$x" "${x// /_}"
done
На Debian, Ubuntu и производных, можно использовать Perl rename
(другие дистрибутивы поставляют другую программу как rename
, и та программа не полезна здесь).
rename 's/ /_/g' *
Обязательное zsh решение:
autoload zmv
zmv '(*)' '${1// /_}'
Обязательное решение POSIX:
for x in *" "*; do
y=$(printf %sa "$x" | tr " " "_")
mv -- "$x" "${y%a}"
done
Можно использовать rename
для этого (сюда принятие того от util-linux
, не perl
один):
cd /path/to/dir
rename ' ' _ *\ *
Это найдет все пространство файлов и каталогов на имя и заменит пространство подчеркиванием. Так как это использует файл шарика, соответствующий Вам, должен быть в правильном каталоге для запуска с.
Если Вы хотите сделать рекурсивные соответствия, Вы можете, но Вам, возможно, придется выполниться rename
пару раз для ловли любых объектов в каталогах, которые самих были переименованы:
cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
rename
переименует указанные файлы путем замены первого вхождения от на их имя к”. Таким образом, это будет только работать на файлы с одиночным пробелом на их имя. (Вы могли звонить rename
в цикле, но это не действительно правильный инструмент здесь.)
– Gilles 'SO- stop being evil'
21.08.2011, 03:54
_
, это не работает имена с несколькими пробелами.
– Gilles 'SO- stop being evil'
21.08.2011, 03:58
Если Вы не флэш-память в регулярных выражениях (я не!), и можно запустить приложения, разработанные для kde (или Вы используете kde - k рабочий стол, или Вы имеете, это - установленные библиотеки), затем krename является большой графической утилитой, которая позволяет Вам видеть прежде и после того, как прежде чем Вами соглашаются на изменения. Это имеет много простых преобразований как опции и также поддерживает регулярные выражения. Можно даже объединить несколько последовательных преобразований в, каждый переименовывает так, Вы не должны разрабатывать единственное сложное преобразование, которое делает все это сразу. Это также имеет опцию продолжить переименовывать те же файлы после того, как переименовывание было применено.
Я не использую его, что часто, но когда я делаю, это действительно сделало задание быстро и легко. Это действительно пригождается при переименовании различных загруженных медиа-файлов, таким образом, можно управлять ими однородно в системе. Это помогает загрузить krename руководство отдельно, таким образом, можно обратиться к нему при использовании программы.
На Debian/Ubuntu, полагаясь на ответы Caleb и Gilles, это - то, что работало на меня для переименования файлов рекурсивно:
cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **
Примечание: К предварительному просмотру, в какие файлы были бы переименованы и как, используйте -n
переключатель с rename
:
rename -n 's/ /_/g' **
Другое примечание: установка globstar
делает **
файлы соответствия во всех подкаталогах, поэтому если только текущий каталог желаем, не устанавливают globstar или использование *
вместо **
.
Еще одно примечание: rename
управляйте, чтобы потребности были выполнены несколько раз для файлов с несколькими случаями критерия поиска.
a b/c d
кому: a_b/c_d
не работал бы, Вы должны будете сначала переименовать a b/c d
кому: a b/c_d
, и затем a b
кому: a_b
).
– Stéphane Chazelas
20.12.2013, 18:15
rename
управлять дважды?
– Markus Pscheidt
20.12.2013, 18:19
**
исключает dotfiles и пересекает символьные ссылки.
– Stéphane Chazelas
20.12.2013, 18:26
for f in *\ *; do mv "$f" "${f// /}"; done
(Учитывая, что вы находитесь в каталоге, в котором хотите выполнить эту операцию ).
find -maxdepth 1
сделать точно что OP, который спрашивают о работе на текущей папке. – Caleb 20.08.2011, 09:34-depth
опция, и можно избавиться отsort
. – glenn jackman 20.08.2011, 17:52-name '* *'
кому:-name '*_*'
и изменение"${1// /_}"
кому:"${1//_/.}"
– enzotib 24.01.2013, 21:41bash
страница справочника. – enzotib 30.01.2013, 11:31