linuxで、大量のファイルを一気に変換をかけるにはどうすればいいでしょう?


1.大量のファイルを一気に処理する。→ find -exec を使う。
2.変換かける。
たとえば、文字コードを変換するとして、nkfを使うとすると
nkf -e filename >filename.new; mv filename filename.bak; mv filename.new filename;

(nkfはあくまで例にすぎませんし、nkfにこだわっているわけではありません)

1, 2 を組み合わせるとかシェルスクリプトを作るとかすれば
まあなんとかなるとは思いますが、

***これ以上にスマートな方法があれば教えてください。***

そんな場面に打ってつけのコマンドが既にあって、
それを紹介してくれたら最高です。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2006/05/30 12:53:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:znz No.3

回答回数193ベストアンサー獲得回数25

ポイント100pt

inplace(1)はどうでしょうか?

manual pageにある例では

  • inplace sort file1 file2 file3
  • inplace 'sort %1 > %2' file1 file2 file3
  • inplace -e 'iconv -f EUC-JP -t UTF-8' -e 'perl -pe "s/$/\\r/"' file1 file2 file3
  • inplace -b.orig 'convert -rotate 270 -resize 50%% %1 %2' *.jpg
  • find mp3/Some_Artist -name '*.mp3' -print0 | xargs -0 inplace -te 'mp3info -a "Some Artist" -g "Progressive Rock" %1'

のような使い方が出来るようです。

http://akinori.org/#inplace

http://www.google.co.jp/search?q=inplace&h=ja&ie=EUC-JP&domains=...

id:aukjs

非常にいい感じです。

いるか候補です。

2006/05/29 23:20:55

その他の回答3件)

id:Kumappus No.1

回答回数3784ベストアンサー獲得回数185

ポイント10pt

http://www.club.kyutech.ac.jp/support/manual/nkf-qkc.html

http://hp.vector.co.jp/authors/VA000501/

ちょっと外しているかもしれませんが、QKCを使うというのは?

id:aukjs

あの~文字コード変換にこだわっているわけではないのです。

nkfにこだわっているわけでも、文字コード変換にこだわっているわけでも、

フィルター処理を一気に大量のファイルに適用する手段が主な質問意図です。

残念ながら、外しております。

2006/05/29 16:33:02
id:naochin No.2

回答回数170ベストアンサー獲得回数8

ポイント10pt

xargsコマンドを使うとうまく処理できます。

echo \<* | xargs rm

このようにすると、

rm \<*

と同様に処理できますが、ファイル数が多くてもちゃんと動作します。

左側をfindにすると、findで該当するファイルだけ指定することができます。

フィルタをうまく該当させるようにするためには、パイプのあとをシェルスクリプトにしたほうがいいかもしれません。

詳しくは、man xargsで調べてみてください。

id:aukjs

nkfを例にでもして、xargsを使ってどうすれば実現できるのかを示せれば、バッチリなんですが。

2006/05/29 19:45:35
id:znz No.3

回答回数193ベストアンサー獲得回数25ここでベストアンサー

ポイント100pt

inplace(1)はどうでしょうか?

manual pageにある例では

  • inplace sort file1 file2 file3
  • inplace 'sort %1 > %2' file1 file2 file3
  • inplace -e 'iconv -f EUC-JP -t UTF-8' -e 'perl -pe "s/$/\\r/"' file1 file2 file3
  • inplace -b.orig 'convert -rotate 270 -resize 50%% %1 %2' *.jpg
  • find mp3/Some_Artist -name '*.mp3' -print0 | xargs -0 inplace -te 'mp3info -a "Some Artist" -g "Progressive Rock" %1'

のような使い方が出来るようです。

http://akinori.org/#inplace

http://www.google.co.jp/search?q=inplace&h=ja&ie=EUC-JP&domains=...

id:aukjs

非常にいい感じです。

いるか候補です。

2006/05/29 23:20:55
id:Kityo No.4

回答回数161ベストアンサー獲得回数12

ポイント10pt

http://furyo.on-air.ne.jp/linux/bash.html

 URLは少し適当です。

 forなりforeachなりを使えば良いのでは?と思います。

 普段はDOSシェル(CMD.exe)を使っているので、UNIX系のシェルは基本的にはマニュアルや安直本を見ながらですので、少々不正確かもしれませんが、bashをお使いであれば

for FileName in `ls a*`;do

nkf -e ${FileName} >${FileName}.new; mv ${FileName} ${FileName}.bak; mv ${FileName}.new ${FileName}

done

で、a*にマッチするファイルを変換すると思います。(lsのデフォルトの挙動が、余計な出力をしない設定の場合)

 お使いのシェルが何であれ、この種の繰り返し文は「for」か「foreach」あたりの名前でサポートされていると思いますので、manか何かでお調べ下さい。

 余談ですがfind -execはファイルを探す条件を指定するのであって、一括処理に使うのはどうかと思います。

id:aukjs

>forなりforeachなりを使えば良いのでは?と思います。

質問で示したのとあまり代わり映えしないような...

>お使いのシェルが何であれ、この種の繰り返し文は「for」か「foreach」あたりの名前でサポートされていると思いますので、manか何かでお調べ下さい。

人力検索を否定しているような...

>余談ですがfind -execはファイルを探す条件を指定するのであって、一括処理に使うのはどうかと思います。

覚えておきます。

以降は、znzさんを超える回答を期待しています。

2006/05/30 01:28:22
  • id:aukjs
    znzさんの回答がバッチリでした。

    おかげで目的を簡単に達成できました。
    ありがとうございました。
  • id:lurker
    xargs を使うのが一番安全だと思います。
    すべてを説明するのは面倒くさいので割愛させていただきますが
    ファイル名に日本語が含まれていたりする場合だと
    -exec ではうまく動作しない場合があります。

    それともう一点。話は逸れます。
    nkf でわざわざ
    一時ファイルを作る => mvする
    という手順を踏まれているみたいですが、
    実は、--overwrite オプションというものがあり
    そんな事をする必要はありません。

    以上の事をふまえると、
    このようにするのが安全かつスマートだと思われます。
    find . -type f -print0 | xargs -0 nkf -e --overwrite


    もう、解決されたみたいなのでアレですが。。。
  • id:aukjs
    find path cond -print0 | xargs -0
    は今後覚えておきます。いままで普通にfind -execしてました(汗

    nkfでない場合もつかえる汎用的な手段がほしかったんですよ。
    なぜかみなさん、これにこだわる。
    質問のしかたが悪かったですかね。

この質問への反応(ブックマークコメント)

トラックバック

  • 一括変換 interGlacial 2007-05-16 10:28:44
    Red Hat Linux 9 の頃からメモ取り環境として howm を使って来ました。近頃は weblog ばっかりですが。 最初の方の漢字コードが EUC でして(それ以降は UTF-8)、これを UTF-8 に変換しようと思い...
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません