• 締切済み

Linuxで*をつかってファイル移動をしたいのですが、引数リストが長すぎますとエラーが出ます。解決方法を教えてください!

Linuxで*をつかってファイル移動をしたいのですが、 引数リストが長すぎますとエラーが出ます。 解決方法を教えてください! 例えば、何千個もあるpng画像ファイルをABCフォルダに入れたいとき、 mv *.png ABC/ とすると -bash: /bin/mv/: 引数リストが長すぎます とエラーが出ます。 Linux初心者なもので、具体的にどのように入力したらいいのか、 お教えください。 よろしくお願いします。

みんなの回答

  • capy2009
  • ベストアンサー率72% (337/465)
回答No.8

find ./ -type f -name "*.png" -print0 | xargs -0 -I{} mv {} <destination> ではいかが。 うまく行かないようなら、 find . -type f -name "*.png" -exec mv {} <destination> \; も試してみてください。ちなみにセミコロンの前にあるのは、バックスラッシュです。ここに書き込んだ時点で文字化けしているかもしれないので、コピペでなく手入力してください。

  • capy2009
  • ベストアンサー率72% (337/465)
回答No.7

> mv a*.png ABC/ > mv b*.png ABC/ >   | > mv z*.png ABC/ そんなスクリプトじゃ a*.png とかが数千個あれば結局同じ事です。それに「あいうえお.png」とかはどうするんですか? 書くとすれば cd source_directory find . -type f -name "*.png" | \ while read filename do mv $filename /target_directory/ done でしょうかね。でもこれもファイル名にスペースがあったりするとうまく行かない可能性があるので、やはり xargs を利用した1行コマンドがベストです。

Leo1984
質問者

補足

xargsでのコマンド入力を具体的に教えてもらえませんか? よろしくお願いします。

  • j38
  • ベストアンサー率22% (9/40)
回答No.6

なるほど、展開してしまうんですね。 mv abc.png cde.png...... ABC/ ならば、シェルスクリプトを作って実行すれば良いのでは? mv a*.png ABC/ mv b*.png ABC/   | mv z*.png ABC/

Leo1984
質問者

補足

すみません、数が多すぎて対応ができません・・・。

  • capy2009
  • ベストアンサー率72% (337/465)
回答No.5

#2~#4 さんは誤解されているようですが、mv コマンドが動かないんじゃなくて、対象ファイルが数千とか数万の単位になると、シェルが展開できなくなってエラーが起きるという事です。ですから、検証するなら数千個のファイルを作らないと意味がないですよ。 本題については、#1 さんの書かれているとおり xargs を使うか、find コマンドの exec オプションが '+' をサポートしているタイプなら find . -type f -name "*.png" -exec mv {} <destination> + とすればいいでしょう。

Leo1984
質問者

補足

回答ありがとうございます。 findでやってみると find: `-exec' に引数が見つかりません とエラーがでました。 どうしたらいいのでしょうか?

  • j38
  • ベストアンサー率22% (9/40)
回答No.4

気になったので、外付けHDDをつないで VM配下でCentOS(RHEL互換)を立ち上げて実験してみました。 1).abc.txtを作成して、さらにコピーでcde.txtを作る。 2).カレントの下にABCディレクトリを作成して、パーミッションを777にする。 3).mv *.txt ABC/ 正常に実行されます。 シェルは、デフォルトでbashなのでbashを使用しました。 次に、UNIX(Solaris 10)で同じ実験をします。 # mkdir ABC # chmod 777 ABC # bash ※ここで、シェルが違うのに気付いた^^; bash-3.00# cp abc.txt cde.txt bash-3.00# mv *.txt ABC/ bash-3.00# cd ABC bash-3.00# ls abc.txt cde.txt うまくいってます。 もしかして、ものすごく古いLinuxをお使いですか? Redhat 9とか?

Leo1984
質問者

補足

何度も回答ありがとうございます。 2,3個のファイル移動はできるのですが2000個になると出来ませんでした。 vine Linux 5(?) を使っています。

  • j38
  • ベストアンサー率22% (9/40)
回答No.3

外付けHDDをつなげないとLinuxが上がらないので 机上で答えています。 1).まず mv *.{png} A/ 2).上記が失敗したら mv *.{png, dummy} A/ ※dummyという拡張子のファイルが無いものと仮定します。 うまくいかないときには、明日つなげて試してみます。

  • j38
  • ベストアンサー率22% (9/40)
回答No.2

下記のように実行してみるとどうなりますか? mv *.{png} ABC/

  • takapiii
  • ベストアンサー率55% (944/1707)
回答No.1

どの位のファイル数があるんでしょうか。エラーになるほどありますか? とりあえずxargsを使用して回避してみてください。 http://ja.wikipedia.org/wiki/Xargs

Leo1984
質問者

補足

解答ありがとうございます。 ファイル数は2000個くらいです。 サイトを見たのですが、具体的にどうしたらいいかわかりませんでした・・・。 どう入力したらいいのでしょうか? 初心者ですみません。

関連するQ&A