別の拡張子(.md)に自動的に変換する1つの拡張子(この場合は.txt)を持つファイルでいっぱいのディレクトリがあります。
このディレクトリ内のすべてのファイルを別のファイル拡張子に変換するために使用できる簡単なターミナルワンライナーはありますか?
または、正規表現を使用してスクリプトを記述する必要がありますか?
次のようなものを使用できます。
for old in *.txt; do mv $old `basename $old .txt`.md; done
最初にコピーを作成してください!
または、ren
(名前変更)ユーティリティをインストールできます。
brew install ren
ren '*.txt' '#1.md'
ファイル名にプレフィックスまたはサフィックスが付いているファイルの名前を変更する場合
ren 'prefix_*.txt' 'prefix_#1.md'
これにはターミナルは必要ありません...名前を変更したいすべてのファイルをハイライトするだけです。右クリックして「##アイテムの名前を変更」を選択し、「検索:」ボックスに「.txt」を入力し、「置換:」ボックスに「.md」を入力します。
これを行うための好ましいUnixの方法(はい、OS XはUnixに基づいています):
ls | sed 's/^\(.*\)\.txt$/mv "\1.txt" "\1.md"/' | sh
設計によりfor
if 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"
$
ご覧のとおり、これは1行だけでなく、完全なスクリプトであり、さらに別のスクリプトを出力として作成することで機能します。そのため、ワンライナースクリプトによって生成されたスクリプトをsh
にフィードします。これは、OS Xのスクリプトインタープリターです。もちろん、スペースを含むファイル名でも機能します初期化。
BTW:Terminalに何かを入力するたびに、ls
やdate
などの1つのWordを持つ単一のコマンドであっても、スクリプトを作成します。Unixシェルで実行されるものは常にスクリプト/プログラムであり、ASCIIベースのストリーム(この場合はデータストリームではなく命令ストリーム)にすぎません。
sh
によって実行されている実際のコマンドを確認するには、sh
の後に-x
オプションを追加します。これにより、シェルのデバッグ出力がオンになり、すべてのmv
コマンドが表示されますsed
エディタースクリプトによって渡された実際の引数で実行されます(そう、スクリプト内の別のスクリプト:-))。
ただし、複雑さを好む場合は、awk
を使用することもできます。基本的な作業だけを行うために他のプログラムをインストールしたい場合は、ren
があります。私は、この単純な毎日のタスクのために50行程度のPerl
スクリプトを書くことを好む人でさえ知っています。
Finderではファイルの名前を変更する方が簡単かもしれませんが、リモートでMacに接続している場合(たとえば、ssh
を介して)、Finderを使用することはまったくできません。それが、cmd行が依然として非常に便利な理由です。
上記の選択された最も正確な答えに基づいて、再利用性のためのbash関数を次に示します。
function change_all_extensions() {
for old in *."$1"; do mv $old `basename $old ."$1"`."$2"; done
}
使用法:
$ change_all_extensions txt md
(その答えのコメントにきれいなコードの書式を設定する方法がわかりませんでした。)
ファイルの最後に.gifx.gif
という名前が付けられ、OS Xで最後の.gif
が削除されるという同様の問題がありました。
for old in *.gifx.gif; do
mv $(echo "$old") $(echo "$old" | sed 's/x.gif//');
done
このコマンドを打つだけでスクリプトを書く必要はありません
find ./ -name "*.txt" | xargs -I '{}' basename '{}' | sed 's/\.txt//' | xargs -I '{}' mv '{}.txt' '{}.md'
プログラミングがあまり得意ではない方は、この記事をご覧ください wiki how 。
コーディングを必要としない多くの方法を示しています
そして、このブログ投稿で ファイル拡張子の変更 を確認することもできます。
すべての処理を実行するコンソールアプリケーションが含まれています。
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