1 つの拡張子 (この場合は .txt) を持つファイルでいっぱいのディレクトリがあり、別の拡張子 (.md) に自動的に変換したいと考えています。
このディレクトリ内のすべてのファイルを別のファイル拡張子に変換するために使用できる簡単な端末ワンライナーはありますか?
または、正規表現を使用してスクリプトを作成する必要がありますか?
1 つの拡張子 (この場合は .txt) を持つファイルでいっぱいのディレクトリがあり、別の拡張子 (.md) に自動的に変換したいと考えています。
このディレクトリ内のすべてのファイルを別のファイル拡張子に変換するために使用できる簡単な端末ワンライナーはありますか?
または、正規表現を使用してスクリプトを作成する必要がありますか?
次のようなものを使用できます。
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'
これにはターミナルは必要ありません...名前を変更するすべてのファイルを強調表示するだけです。右クリックして [Rename ## items] を選択し、[Find:] ボックスに「.txt」と入力し、[Replace with:] ボックスに「.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"
$
ご覧のとおり、これはワンライナーではなく完全なスクリプトであり、出力として別のスクリプトを作成することでさらに機能します。sh
では、ワンライナー スクリプトによって作成されたスクリプトを、 OS Xのスクリプト インタープリターであるにフィードしてみましょう。もちろん、スペースが含まれるファイル名でも機能します。
ところで:ターミナルに何かを入力するたびに、スクリプトが作成されます。たとえそれが 1 つの単語を含む 1 つのコマンドであったとしてもですls
。Unixdate
シェルで実行されるものはすべて、常にスクリプト/プログラムであり、ASCII ベースのストリームに過ぎません。 (この場合、データ ストリームではなく命令ストリーム)。
によって実行されている実際のコマンドを表示するには、 の後にオプションをsh
追加するだけで、シェルでのデバッグ出力が有効になります。そのため、エディター スクリプトによって渡された実際の引数を使用して実行されているすべてのコマンドが表示されます (スクリプト内の別のスクリプト: -) )。-x
sh
mv
sed
ただし、複雑さが好きな場合は、 を使用することもできます。awk
また、他のプログラムをインストールして基本的な作業だけを行いたい場合は、ren
. perl
この単純な毎日の作業のために 50 行ほどのスクリプトを書きたがる人もいます。
ファイルの名前を変更するのは finder の方が簡単かもしれませんが、リモートで Mac に接続している場合 (例: 経由ssh
)、finder を使用することはまったくできません。そのため、コマンドラインは依然として非常に便利です。
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'
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