Как заменить один символ другим во всех именах файлов текущих каталогов?

zlib реализует сжатие, используемое gzip, но не форматом файла. Вместо этого необходимо использовать gzip модуль, который сам использует zlib.

import gzip
s = '...'
with gzip.open('/tmp/data', 'w') as f:
    f.write(s)

41
20.08.2011, 08:26
7 ответов

Если необходимо переименовать файлы в подкаталогах также и Вашем 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...) решил бы проблему.

36
27.01.2020, 19:35
  • 1
    Необходимо было бы использовать find -maxdepth 1 сделать точно что OP, который спрашивают о работе на текущей папке. –  Caleb 20.08.2011, 09:34
  • 2
    Используйте находку -depth опция, и можно избавиться от sort. –  glenn jackman 20.08.2011, 17:52
  • 3
    Изменение -name '* *' кому: -name '*_*' и изменение "${1// /_}" кому: "${1//_/.}" –  enzotib 24.01.2013, 21:41
  • 4
    @kroiz: это называют "Заменой шаблона". Вы могли найти его в bashстраница справочника. –  enzotib 30.01.2013, 11:31

В любой оболочке можно циклично выполниться по файлам, имя которых содержит пространство. Замена пробелов с символами нижнего подчеркивания легка в ударе, 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
35
27.01.2020, 19:35

Можно использовать rename для этого (сюда принятие того от util-linux, не perl один):

cd /path/to/dir
rename ' ' _ *\ *

Это найдет все пространство файлов и каталогов на имя и заменит пространство подчеркиванием. Так как это использует файл шарика, соответствующий Вам, должен быть в правильном каталоге для запуска с.

Если Вы хотите сделать рекурсивные соответствия, Вы можете, но Вам, возможно, придется выполниться rename пару раз для ловли любых объектов в каталогах, которые самих были переименованы:

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
13
27.01.2020, 19:35
  • 1
    rename переименует указанные файлы путем замены первого вхождения от на их имя к”. Таким образом, это будет только работать на файлы с одиночным пробелом на их имя. (Вы могли звонить rename в цикле, но это не действительно правильный инструмент здесь.) –  Gilles 'SO- stop being evil' 21.08.2011, 03:54

Другая опция была бы mmv, если установлено.

mmv \*\ \* \#1_#2
2
27.01.2020, 19:35
  • 1
    Это только изменяет первое пространство в a _, это не работает имена с несколькими пробелами. –  Gilles 'SO- stop being evil' 21.08.2011, 03:58
  • 2
    Oups, Вы правы. Извините за беспорядок. –  glglgl 21.08.2011, 07:41

Если Вы не флэш-память в регулярных выражениях (я не!), и можно запустить приложения, разработанные для kde (или Вы используете kde - k рабочий стол, или Вы имеете, это - установленные библиотеки), затем krename является большой графической утилитой, которая позволяет Вам видеть прежде и после того, как прежде чем Вами соглашаются на изменения. Это имеет много простых преобразований как опции и также поддерживает регулярные выражения. Можно даже объединить несколько последовательных преобразований в, каждый переименовывает так, Вы не должны разрабатывать единственное сложное преобразование, которое делает все это сразу. Это также имеет опцию продолжить переименовывать те же файлы после того, как переименовывание было применено.

Я не использую его, что часто, но когда я делаю, это действительно сделало задание быстро и легко. Это действительно пригождается при переименовании различных загруженных медиа-файлов, таким образом, можно управлять ими однородно в системе. Это помогает загрузить krename руководство отдельно, таким образом, можно обратиться к нему при использовании программы.

http://www.krename.net/

0
27.01.2020, 19:35

На Debian/Ubuntu, полагаясь на ответы Caleb и Gilles, это - то, что работало на меня для переименования файлов рекурсивно:

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

Примечание: К предварительному просмотру, в какие файлы были бы переименованы и как, используйте -n переключатель с rename:

rename -n 's/ /_/g' **

Другое примечание: установка globstar делает ** файлы соответствия во всех подкаталогах, поэтому если только текущий каталог желаем, не устанавливают globstar или использование * вместо **.

Еще одно примечание: rename управляйте, чтобы потребности были выполнены несколько раз для файлов с несколькими случаями критерия поиска.

1
27.01.2020, 19:35
  • 1
    Тот единственные работы, если каталоги не содержат пробелы. (переименовывание 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
  • 2
    @Stephane: это означает выполнять то же rename управлять дважды? –  Markus Pscheidt 20.12.2013, 18:19
  • 3
    Ну, больше как так же много раз как существуют вложенные уровни каталогов с пробелами. Идеально, Вы хотите пересечь глубину каталога сначала и преобразовать только базовое имя файла как в принятом решении. Также обратите внимание что удар ** исключает dotfiles и пересекает символьные ссылки. –  Stéphane Chazelas 20.12.2013, 18:26
for f in *\ *; do mv "$f" "${f// /}"; done

(Учитывая, что вы находитесь в каталоге, в котором хотите выполнить эту операцию ).

-1
07.04.2021, 14:57

Теги

Похожие вопросы