74

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

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

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

4

10 に答える 10

142

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

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

まずはコピー!

于 2013-02-15T02:11:44.183 に答える
68

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

brew install ren

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

ファイル名に接頭辞または接尾辞を付けてファイルの名前を変更したい場合

ren 'prefix_*.txt' 'prefix_#1.md'
于 2015-02-13T07:24:40.963 に答える
45

これにはターミナルは必要ありません...名前を変更するすべてのファイルを強調表示するだけです。右クリックして [Rename ## items] を選択し、[Find:] ボックスに「.txt」と入力し、[Replace with:] ボックスに「.md」と入力します。

于 2015-01-29T02:49:16.137 に答える
8

これを行う Unix の推奨される方法 (はい、OS X は Unix に基づいています) は次のとおりです。

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

ファイル名のリスト全体をループするように設計されたforifでループするのはなぜですか? lsパイプがありますので、使用してください。コマンドを使用して出力を作成/変更できるだけでなく、コマンド (そうです、コマンドによって作成されたコマンドであり、Unix の発明者の 1 人である Brian Kernighan が 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"
$

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

ところで:ターミナルに何かを入力するたびに、スクリプトが作成されます。たとえそれが 1 つの単語を含む 1 つのコマンドであったとしてもですls。Unixdateシェルで実行されるものはすべて、常にスクリプト/プログラムであり、ASCII ベースのストリームに過ぎません。 (この場合、データ ストリームではなく命令ストリーム)。

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

ただし、複雑さが好きな場合は、 を使用することもできます。awkまた、他のプログラムをインストールして基本的な作業だけを行いたい場合は、ren. perlこの単純な毎日の作業のために 50 行ほどのスクリプトを書きたがる人もいます。

ファイルの名前を変更するのは finder の方が簡単かもしれませんが、リモートで Mac に接続している場合 (例: 経由ssh)、finder を使用することはまったくできません。そのため、コマンドラインは依然として非常に便利です。

于 2016-04-18T22:31:28.667 に答える
3

No need to write a script for it just hit this command

find ./ -name "*.txt" | xargs -I '{}' basename '{}' | sed 's/\.txt//' | xargs -I '{}' mv '{}.txt'  '{}.md'
于 2016-08-29T04:01:11.453 に答える
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
于 2013-02-21T08:57:37.877 に答える