- 締切済み
Linuxで*をつかってファイル移動をしたいのですが、引数リストが長すぎますとエラーが出ます。解決方法を教えてください!
Linuxで*をつかってファイル移動をしたいのですが、 引数リストが長すぎますとエラーが出ます。 解決方法を教えてください! 例えば、何千個もあるpng画像ファイルをABCフォルダに入れたいとき、 mv *.png ABC/ とすると -bash: /bin/mv/: 引数リストが長すぎます とエラーが出ます。 Linux初心者なもので、具体的にどのように入力したらいいのか、 お教えください。 よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- capy2009
- ベストアンサー率72% (337/465)
find ./ -type f -name "*.png" -print0 | xargs -0 -I{} mv {} <destination> ではいかが。 うまく行かないようなら、 find . -type f -name "*.png" -exec mv {} <destination> \; も試してみてください。ちなみにセミコロンの前にあるのは、バックスラッシュです。ここに書き込んだ時点で文字化けしているかもしれないので、コピペでなく手入力してください。
- capy2009
- ベストアンサー率72% (337/465)
> 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行コマンドがベストです。
- j38
- ベストアンサー率22% (9/40)
なるほど、展開してしまうんですね。 mv abc.png cde.png...... ABC/ ならば、シェルスクリプトを作って実行すれば良いのでは? mv a*.png ABC/ mv b*.png ABC/ | mv z*.png ABC/
補足
すみません、数が多すぎて対応ができません・・・。
- capy2009
- ベストアンサー率72% (337/465)
#2~#4 さんは誤解されているようですが、mv コマンドが動かないんじゃなくて、対象ファイルが数千とか数万の単位になると、シェルが展開できなくなってエラーが起きるという事です。ですから、検証するなら数千個のファイルを作らないと意味がないですよ。 本題については、#1 さんの書かれているとおり xargs を使うか、find コマンドの exec オプションが '+' をサポートしているタイプなら find . -type f -name "*.png" -exec mv {} <destination> + とすればいいでしょう。
補足
回答ありがとうございます。 findでやってみると find: `-exec' に引数が見つかりません とエラーがでました。 どうしたらいいのでしょうか?
- j38
- ベストアンサー率22% (9/40)
気になったので、外付け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とか?
補足
何度も回答ありがとうございます。 2,3個のファイル移動はできるのですが2000個になると出来ませんでした。 vine Linux 5(?) を使っています。
- j38
- ベストアンサー率22% (9/40)
外付けHDDをつなげないとLinuxが上がらないので 机上で答えています。 1).まず mv *.{png} A/ 2).上記が失敗したら mv *.{png, dummy} A/ ※dummyという拡張子のファイルが無いものと仮定します。 うまくいかないときには、明日つなげて試してみます。
- j38
- ベストアンサー率22% (9/40)
下記のように実行してみるとどうなりますか? mv *.{png} ABC/
- takapiii
- ベストアンサー率55% (944/1707)
どの位のファイル数があるんでしょうか。エラーになるほどありますか? とりあえずxargsを使用して回避してみてください。 http://ja.wikipedia.org/wiki/Xargs
補足
解答ありがとうございます。 ファイル数は2000個くらいです。 サイトを見たのですが、具体的にどうしたらいいかわかりませんでした・・・。 どう入力したらいいのでしょうか? 初心者ですみません。
補足
xargsでのコマンド入力を具体的に教えてもらえませんか? よろしくお願いします。