コンパイルされた C プログラムが多数入ったディレクトリがあり、これをバックアップしたいと考えています。現在は という名前が付けられていますprogram.out
が、これを に変更したいと思いますprogram
。
これらを除外することはまだ可能ですか? また、これらすべての名前をすばやく変更するには、どのような正規表現を使用すればよいですか?
答え1
コードをバックアップするには、git またはその他のバージョン管理ソフトウェアを使用します。インターネット上には、github、bitbucket など、多くの選択肢があります。
gitでは.gitignoreファイルがあり、そこに*.outを追加するとリポジトリに転送されません。
答え2
最初の質問がよくわかりません。名前を変更したい場合はprogram.out
、program
次のコマンドを実行してください。
mv program{.out,}
/etc
2 番目の質問では、サフィックスを持つファイルのリストを取得したいと仮定します。
#!/bin/bash
ls /etc > /tmp/etcfiles
while read line
do
if [[ $line =~ \..+ ]]; then
echo $line
fi
done < /tmp/etcfiles
必要に応じて上記を調整できます。
\.
文字通りのピリオドと一致します。.
ピリオドの後の任意の文字に一致します。+
は、最初のピリオドの後に少なくとも 1 つの文字が続く必要があることを示しています。したがって、これは に一致しますtest.c
が、 には一致しません。 もtest.
一致させたい場合は、を にtest.
変更します。+
*
答え3
シェルとして bash を使用している場合、これはシェル パイプラインの簡単なタスクです。
ls | grep '\.out$' | while read file; do echo mv "$file" "${file%.*}"; done
ls
ディレクトリ内のファイルのリストを生成します。
grep '\.out$'
.out で終わるファイル名を抽出し、残りを破棄します。
while read file
ファイル名を 1 つずつ読み取ります。
echo mv "$file" "${file%.*}"
表示はしますが、各ファイルの名前を拡張子なしのバージョンに変更する mv コマンドは実行しません。重要${file%.*}
なのは、ファイル拡張子を削除するための bash 構文です。パイプラインを実際に実行した場合に期待どおりに動作することを確認したら、そのecho
部分を削除して実際に実行します。
ls | grep '\.out$' | while read file; do mv "$file" "${file%.*}"; done