3つのファイル(template _ *。txt)があるとします。
- template_x.txt
- template_y.txt
- template_z.txt
それらを3つの新しいファイル(foo _ *。txt)にコピーしたいと思います。
- foo_x.txt
- foo_y.txt
- foo_z.txt
1つのコマンドでそれを行う簡単な方法はありますか?
cp --enableAwesomeness template_*.txt foo_*.txt
3つのファイル(template _ *。txt)があるとします。
それらを3つの新しいファイル(foo _ *。txt)にコピーしたいと思います。
1つのコマンドでそれを行う簡単な方法はありますか?
cp --enableAwesomeness template_*.txt foo_*.txt
template_*。txtのfの場合; do cp $ f foo _ $ {f#template_}; 終わり
[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
私は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
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done
ファイル名にファンキーな文字が含まれていると、おそらく壊れます。確実に機能することが確信できる場合は、「-v」を削除します。
このコマンドmmv
( DebianまたはFinkで利用可能、または自分で簡単にコンパイルできる) は、まさにこのタスクのために作成されました。単純な Bash ソリューションでは、変数展開に関するドキュメントを常に調べる必要があります。しかしmmv
、使い方ははるかに簡単で、「awesomeness」にかなり近いです!;-)
あなたの例は次のようになります。
mcp "template_*.txt" "foo_#1.txt"
mmv
より複雑なパターンも処理でき、いくつかの健全性チェックがあります。たとえば、宛先セット内のファイルがソース セットに表示されないようにします (ファイルを誤って上書きすることはありません)。
それを行うさらに別の方法:
$ ls template_*.txt | sed -e 's/^template\(.*\)$/cp template\1 foo\1/' | ksh -sx
私はいつも、イメージ フォーマットで期待どおりの処理を行うImageMagick変換プログラムに感銘を受けてきました。
$ convert rose.jpg rose.png
バッチ変換を可能にする姉妹プログラムがあります。
$ mogrify -format png *.jpg
明らかに、これらは画像変換に限定されていますが、興味深いコマンド ライン インターフェイスがあります。