Bash のワンライナー:template_*.txt を foo_*.txt にコピーしますか?
-
09-06-2019 - |
質問
3 つのファイル (template_*.txt) があるとします。
- テンプレート_x.txt
- テンプレート_y.txt
- テンプレート_z.txt
それらを 3 つの新しいファイル (foo_*.txt) にコピーしたいと思います。
- foo_x.txt
- foo_y.txt
- foo_z.txt
1 つのコマンドでそれを行う簡単な方法はありますか。
cp --enableAwesomeness template_*.txt foo_*.txt
解決
for f in template_*.txt; do cp $f foo_${f#template_}; done
他のヒント
[01:22 PM] matt@Lunchbox:~/tmp/ba$
ls
template_x.txt template_y.txt template_z.txt
[01:22 PM] matt@Lunchbox:~/tmp/ba$
for i in template_*.txt ; do mv $i foo${i:8}; done
[01:22 PM] matt@Lunchbox:~/tmp/ba$
ls
foo_x.txt foo_y.txt foo_z.txt
私の好みの方法:
for f in template_*.txt
do
cp $f ${f/template/foo}
done
「置換構文を覚えていない」方法:
for i in x y z
do
cp template_$i foo_$
done
これは機能するはずです:
for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done
ファイル名におかしな文字が含まれていると、おそらく壊れます。確実に動作するという確信が得られた場合は、「-v」を削除してください。
コマンド mmv
(で入手可能 デビアン または フィンク または自分で簡単にコンパイルできます) は、まさにこのタスクのために作成されました。プレーンな Bash ソリューションでは、変数の展開に関するドキュメントを常に参照する必要があります。しかし mmv
使い方ははるかに簡単で、「素晴らしい」にかなり近づいています。;-)
あなたの例は次のようになります:
mcp "template_*.txt" "foo_#1.txt"
mmv
より複雑なパターンも処理でき、いくつかの健全性チェックが行われます。たとえば、宛先セット内のファイルがソース セットに表示されないことを確認します (そのため、誤ってファイルを上書きすることができません)。
bash や cp については何も知りませんが、(たとえば) Perl スクリプトを使用してこの種のことを行う簡単な方法があります。
($op = shift) || die "Usage: rename perlexpr [filenames]\n";
for (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename($was,$_) unless $was eq $_;
}
それから:
rename s/template/foo/ *.txt
さらに別の方法:
$ ls template_*.txt | sed -e 's/^template\(.*\)$/cp template\1 foo\1/' | ksh -sx
私はいつも ImageMagick に感銘を受けています 変換する 画像形式で期待どおりのことを行うプログラム:
$ convert rose.jpg rose.png
バッチ変換を可能にする姉妹プログラムがあります。
$ mogrify -format png *.jpg
明らかに、これらは画像変換に限定されていますが、興味深いコマンド ライン インターフェイスを備えています。