web-dev-qa-db-ja.com

OS Xのディレクトリ内のすべてのファイルのファイル拡張子を変更する

別の拡張子(.md)に自動的に変換する1つの拡張子(この場合は.txt)を持つファイルでいっぱいのディレクトリがあります。

このディレクトリ内のすべてのファイルを別のファイル拡張子に変換するために使用できる簡単なターミナルワンライナーはありますか?

または、正規表現を使用してスクリプトを記述する必要がありますか?

60
Ben McCormick

次のようなものを使用できます。

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

最初にコピーを作成してください!

125

または、ren(名前変更)ユーティリティをインストールできます。

brew install ren

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

ファイル名にプレフィックスまたはサフィックスが付いているファイルの名前を変更する場合

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

これにはターミナルは必要ありません...名前を変更したいすべてのファイルをハイライトするだけです。右クリックして「##アイテムの名前を変更」を選択し、「検索:」ボックスに「.txt」を入力し、「置換:」ボックスに「.md」を入力します。

42
Vicky

これを行うための好ましいUnixの方法(はい、OS XはUnixに基づいています):

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

設計によりfor if lsでループすると、ファイル名のリスト全体がループするのはなぜですか?パイプがあります、それらを使用します。コマンドを使用して出力を作成/変更できるだけでなく、コマンド(右、コマンドによって作成されたコマンドです。Unixの発明者の1人であるBrian KernighanがUnixで最も気に入ったコマンドです)を見てみましょう。 lssedは、shへのパイプを削除することにより生成されます。

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

ご覧のとおり、これは1行だけでなく、完全なスクリプトであり、さらに別のスクリプトを出力として作成することで機能します。そのため、ワンライナースクリプトによって生成されたスクリプトをshにフィードします。これは、OS Xのスクリプトインタープリターです。もちろん、スペースを含むファイル名でも機能します初期化。

BTW:Terminalに何かを入力するたびに、lsdateなどの1つのWordを持つ単一のコマンドであっても、スクリプトを作成します。Unixシェルで実行されるものは常にスクリプト/プログラムであり、ASCIIベースのストリーム(この場合はデータストリームではなく命令ストリーム)にすぎません。

shによって実行されている実際のコマンドを確認するには、shの後に-xオプションを追加します。これにより、シェルのデバッグ出力がオンになり、すべてのmvコマンドが表示されますsedエディタースクリプトによって渡された実際の引数で実行されます(そう、スクリプト内の別のスクリプト:-))。

ただし、複雑さを好む場合は、awkを使用することもできます。基本的な作業だけを行うために他のプログラムをインストールしたい場合は、renがあります。私は、この単純な毎日のタスクのために50行程度のPerlスクリプトを書くことを好む人でさえ知っています。

Finderではファイルの名前を変更する方が簡単かもしれませんが、リモートでMacに接続している場合(たとえば、sshを介して)、Finderを使用することはまったくできません。それが、cmd行が依然として非常に便利な理由です。

8
LBC

上記の選択された最も正確な答えに基づいて、再利用性のためのbash関数を次に示します。

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

使用法:

$ change_all_extensions txt md

(その答えのコメントにきれいなコードの書式を設定する方法がわかりませんでした。)

4
James Tomasino

ファイルの最後に.gifx.gifという名前が付けられ、OS Xで最後の.gifが削除されるという同様の問題がありました。

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

このコマンドを打つだけでスクリプトを書く必要はありません

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

プログラミングがあまり得意ではない方は、この記事をご覧ください wiki how
コーディングを必要としない多くの方法を示しています
そして、このブログ投稿で ファイル拡張子の変更 を確認することもできます。
すべての処理を実行するコンソールアプリケーションが含まれています。

0
Ravened writer
    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
0
Manish Ranjan