2013-02-15 6 views
47

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

このディレクトリのすべてのファイルを別のファイル拡張子に変換するのに使用できる簡単な端末ライナーがありますか?

正規表現を使用してスクリプトを書く必要がありますか?

答えて

101

あなたはこのようなものを使用することができます

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

は最初のコピーを作成します!

+0

そうですね。ありがとう –

+4

マーベリックスでは、これは私のためには、この出力を与える動作しません: 使用法:mv [-f | -i | -n] [-v]ソースターゲット mv [-f | -i | -n] [-v] source ...ディレクトリ –

+1

はMavericksで試してみましたが、正常に動作します。これは、デフォルトのシェルであるbashを使用していることを前提としています。 –

0
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 
35

ターミナルは不要です...名前を変更するファイルをすべて強調表示してください。右クリックして "Rename ## items"を選択し、 "Find:"ボックスに ".txt"と入力し、 "Replace with:"ボックスに ".md"と入力します。あなたは

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

これについては決して知りませんでした - ありがとう! –

+1

うん。これは素晴らしかったです。ターミナルで 'open .'を実行してから、これを実行してください!ずっと簡単。 –

+1

Whoa !!これについて決して知らなかった! – n13

42

また、あなたはren(名前の変更)ユーティリティ

brew install ren 

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

をインストールすることができます上記の再利用のためのbash関数は次のとおりです。

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

使用法:

$ change_all_extensions txt md 

(。私はクリーンなコードがその答えにコメントの書式を取得する方法を見つけ出すことができませんでした)

+3

これは、ファイルのコマンドラインの名前を変更するための最良の方法です。ありがとう! – Emmanuel

+1

ファイル名に接頭辞または接尾辞が付いたファイルの名前を変更する場合は、 'ren '接頭辞_ *。txt' 'prefix_#1.md''を使用できます。 – Raptor

+0

Thanks @Raptor、updated! – Renaud

4

選択し、最も正確な答えに基づいて、ファイル名に接頭辞や接尾辞を持つファイルの名前を変更したい場合は

2

これを行うための好適なUnixの道(はい、OS XのベースとなりますUNIXの場合)である:

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

ls場合、ファイル名のリスト全体を通じて設計ループによってforとルーピングのはなぜ?あなたはパイプを持っています。コマンドだけでなく、コマンド(コマンドによって作成されたコマンド、これはUnixの発明者であるBrian KernighanがUnix上で最も好きだったコマンド)を使って出力を作成/変更することができます。 lssedshへのパイプを除去することで生成します。

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

あなたが見ることができるように、それだけでワンライナーではなく、さらに、出力として別のスクリプトを作成することによって動作し、完全なスクリプト。だから、単一行のスクリプトで作成されたスクリプトをshに送りましょう。 OS Xのスクリプトインタープリタです。もちろん、スペースが入ったファイル名に対しても機能します。

ところで:あなたはターミナルで何かを入力するたびに、あなたはそれがUnixのシェルでなどlsまたはdateすべてが実行されているような一言で唯一の単一のコマンドで、常にスクリプト/プログラムであっても、スクリプトを作成し、これはちょうどASCIIベースのストリーム(この場合、データストリームとは反対の命令ストリーム)です。

shによって実行される実際のコマンドを参照してくださいちょうどシェルでデバッグ出力をオンにsh-xオプションを追加するので、あなたはすべてのmvコマンドはsedエディタスクリプトによって渡された実引数で実行されて表示されますするには(ええと、スクリプト内の別のスクリプト:-))。

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

ファインダーでファイルの名前を変更する方が簡単かもしれませんが、Macにリモートで接続する場合(たとえばssh経由)は、ファインダーを使用することはまったくできません。そのため、cmd行はまだ非常に便利です。それだけでこのコマンドを打つ

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

これはうまく動作します - 再帰的に行うには、 'ls'を 'find'に変更します。-name "* .txt" ' –

1

の必要はありません私は、ファイルが最後に.gifx.gif名前が付けられ、これが最後の.gifを削除するにはOS Xで働いていた同様の問題だった:

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

のスクリプトを書くために

+0

これは、名前のどこにでも 'x?gif'があれば(例えば、' maxsgift.gitx.git')、あなたが意図しているよりもいくつかのファイルを修正します。これは最高です: 'sed s/\。gif $ // ''。 – giusti

0

プログラミングに本当にうまくいかない人は、wiki howでこの記事をチェックできます。
コーディングを含まない多くの方法を示しています。
changing file extensionsでこのブログポストをチェックアウトすることができます。
すべての機能を実行するコンソールアプリケーションが含まれています。

関連する問題