2

В командной строке Windows вы можете сделать следующее:

  • ren *.doc *.txt
  • copy my-precious-document.doc *-backup.doc

Есть ли способ сделать это в мире Linux (включая OS X)? Очень странно находить команды командной строки, которые лучше работают в DOS ...

3 ответа3

2

На самом деле, нет. В Windows глобирование (в Windows только подстановочные знаки) выполняется командой; в * nix глобализация выполняется оболочкой. Ваш первый пример получился бы примерно так:

mv a.doc b.doc c.doc a.txt b.txt c.txt

Очевидно, что утилита не имеет ни малейшего понятия, что с этим делать, и не должна этого делать (игнорируя такие вещи, как mv если вы пытаетесь перейти в каталог). Чтобы выполнить что-то вроде того, что вы хотите сделать, вам нужно использовать что-то вроде этого:

find . -name "*.doc" -print0 | xargs -0 -I {} mv {} {}.txt
# Or...
find . -name "*.doc" -exec mv {} {}.txt \;

Для удобства в Perl есть утилита, которую можно использовать для переименования файлов, которая называется « rename .

rename 's/\.txt$//' *.doc
2

Обратите внимание, что существует две версии rename которые поставляются с различными дистрибутивами.

rename Perl по умолчанию в Ubuntu и варианты, как ответил @ Hello71

Другие дистрибутивы могут поставлять пакет util-linux-ng с синтаксисом:

rename <from> <to> <files>

Для выполнения операции в OP команда будет

rename .doc .txt *.doc

Это заменяет «.doc» в имени файла на «.txt» для любых файлов, заканчивающихся на .doc

OSX не поставляется с переименованием, но если у вас установлен Perl на OSX, вы можете просто скопировать сценарий переименования на ваш компьютер OSX из установки linux. Версия Perl гораздо более гибкая, чем util-linux (см. Выше). Он должен быть в /usr /bin /rename на дистрибутивах типа Ubuntu. Скрипт ожидает, что perl будет в /usr /bin /perl, поэтому вам может потребоваться отредактировать его, если он находится где-то еще в OSX

1

for f in *.doc; do cp "${f}" "${f//.doc/}-backup.doc"; done будет работать. Это добавит -backup.doc в конец каждого файла. ${f//.doc/} удалит все .docs из исходного имени файла, поэтому вы не получите .doc. Лично, хотя, когда я сделать резервную копию, я просто добавить .bkup к имени файла, так что если бы я хотел сделать резервную копию всех .doc каталог , который в отдельную папку резервного копирования, я бы перейти к папке , я хочу cp из и сделать что-то подобное for f in *.doc; do cp "${f}" "~/backups/${f}.bkup"; done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .