Изменение расширений файлов для всех файлов в каталоге на OS X

У меня есть каталог, полный файлов с одним расширением (в данном случае .txt), которые я хочу автоматически преобразовать в другое расширение (.md).

Есть ли простой однострочный терминал, который я могу использовать для преобразования всех файлов в этом каталоге в другое расширение?

Или мне нужно написать скрипт с регулярным выражением?

Ответ 1

Вы можете использовать что-то вроде этого:

for old in *.txt; do mv $old `basename $old .txt`.md; done

Сделайте копию первой!

Ответ 2

В качестве альтернативы вы можете установить утилиту ren (rename)

brew install ren

ren '*.txt' '#1.md'

Если вы хотите переименовать файлы с префиксом или суффикс в именах файлов

ren 'prefix_*.txt' 'prefix_#1.md'

Ответ 3

Терминал не нужен для этого... Просто выделите все файлы, которые вы хотите переименовать. Щелкните правой кнопкой мыши и выберите "Переименовать ## элементы" и просто введите ".txt" в поле "Найти:" и ".md" в поле "Заменить на:".

Ответ 4

Предпочитаемый способ Unix для этого (да, OS X основан на Unix):

ls | sed 's/^\(.*\)\.txt$/mv "\1.txt" "\1.md"/' | sh

Зачем цитировать с помощью for, если ls по контуру дизайна через весь список имен файлов? У вас есть трубы, используйте их. Вы можете создавать/изменять не только вывод с использованием команд, но также и команды (справа, это команды, созданные командой, что Брайан Керниган, один из изобретателей Unix, больше всего понравился в Unix), так что давайте посмотрим, что ls и sed получается путем удаления трубы до sh:

$ ls | sed 's/^\(.*\)\.txt$/mv "\1.txt" "\1.md"/'
mv "firstfile.txt" "firstfile.md"
mv "second file.txt" "second file.md"
$

Как вы можете видеть, это не только однострочный, но и полный script, который, кроме того, работает, создавая еще один script как вывод. Поэтому давайте просто загрузим script, созданный однострочным script в sh, который является интерпретатором script OS X. Конечно, он работает даже для имен файлов с пробелами в нем.

BTW: каждый раз, когда вы вводите что-то в терминале, вы создаете script, даже если это только одна команда с одним словом вроде ls или date и т.д. Все, что работает в оболочке Unix, всегда равно script/program, который представляет собой лишь некоторый поток на основе ASCII (в данном случае поток команд, противоположный потоку данных).

Чтобы увидеть фактические команды, выполняемые sh, просто добавьте параметр -x после sh, который включает вывод отладки в оболочке, поэтому вы увидите каждую команду mv, выполняемую с фактическим аргументы, переданные редактором sed script (да, еще один script внутри script:-)).

Однако, если вам нравится сложность, вы можете даже использовать awk, и если вы хотите установить другие программы, чтобы выполнить основную работу, есть ren. Я знаю даже людей, которые предпочли бы написать 50 строк или около того perl script для этой простой повседневной задачи.

Может быть, проще в finder переименовать файлы, но если он подключен удаленно к Mac (например, через ssh), использование finder вообще невозможно. То почему линия cmd все еще очень полезна.

Ответ 5

Основываясь на выбранном и наиболее точном ответе выше, здесь функция bash для повторного использования:

function change_all_extensions() {
    for old in *."$1"; do mv $old `basename $old ."$1"`."$2"; done
}

Использование:

$ change_all_extensions txt md

(Я не мог понять, как получить чистое форматирование кода в комментарии к этому ответу.)

Ответ 6

Не нужно писать script, чтобы просто нажать эту команду

find ./ -name "*.txt" | xargs -I '{}' basename '{}' | sed 's/\.txt//' | xargs -I '{}' mv '{}.txt'  '{}.md'

Ответ 7

У меня была аналогичная проблема, когда файлы были названы .gifx.gif в конце, и это сработало в OS X, чтобы удалить последний .gif:

for old in *.gifx.gif; do
    mv $(echo "$old") $(echo "$old" | sed 's/x.gif//');
done

Ответ 8

    cd $YOUR_DIR
    ls *.txt > abc
    mkdir target // say i want to move it to another directory target in this case
    while read line
    do 
    file=$(echo $line |awk -F. '{ print $1 }')
    cp $line target/$file.md  // depends if u want  to move(mv) or copy(cp)
    done < abc

Ответ 9

Для тех из вас, кто не очень хорош в программировании, вы можете проверить эту статью на wiki как. показывает много методов, которые не связаны с кодированием
, и вы также можете проверить этот blogpost на изменении расширений файлов. < ш > Он содержит консольное приложение, которое делает все необходимое для вас.