Bash のワンライナー:template_*.txt を foo_*.txt にコピーしますか?

StackOverflow https://stackoverflow.com/questions/26433

  •  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

明らかに、これらは画像変換に限定されていますが、興味深いコマンド ライン インターフェイスを備えています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top