プロが教えるわが家の防犯対策術!

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

例えば、何千個もあるpng画像ファイルをABCフォルダに入れたいとき、

mv *.png ABC/

とすると

-bash: /bin/mv/: 引数リストが長すぎます

とエラーが出ます。

Linux初心者なもので、具体的にどのように入力したらいいのか、
お教えください。

よろしくお願いします。

A 回答 (8件)

find ./ -type f -name "*.png" -print0 | xargs -0 -I{} mv {} <destination>


ではいかが。

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

> 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行コマンドがベストです。

この回答への補足

xargsでのコマンド入力を具体的に教えてもらえませんか?

よろしくお願いします。

補足日時:2009/10/30 15:28
    • good
    • 1

なるほど、展開してしまうんですね。


mv abc.png cde.png...... ABC/

ならば、シェルスクリプトを作って実行すれば良いのでは?
mv a*.png ABC/
mv b*.png ABC/
  |
mv z*.png ABC/

この回答への補足

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

補足日時:2009/10/30 15:30
    • good
    • 0

#2~#4 さんは誤解されているようですが、mv コマンドが動かないんじゃなくて、対象ファイルが数千とか数万の単位になると、シェルが展開できなくなってエラーが起きるという事です。

ですから、検証するなら数千個のファイルを作らないと意味がないですよ。

本題については、#1 さんの書かれているとおり xargs を使うか、find コマンドの exec オプションが '+' をサポートしているタイプなら
find . -type f -name "*.png" -exec mv {} <destination> +
とすればいいでしょう。

この回答への補足

回答ありがとうございます。

findでやってみると

find: `-exec' に引数が見つかりません

とエラーがでました。

どうしたらいいのでしょうか?

補足日時:2009/10/30 15:23
    • good
    • 0

気になったので、外付け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(?) を使っています。

補足日時:2009/10/30 15:19
    • good
    • 0

外付けHDDをつなげないとLinuxが上がらないので


机上で答えています。

1).まず
mv *.{png} A/

2).上記が失敗したら
mv *.{png, dummy} A/
※dummyという拡張子のファイルが無いものと仮定します。

うまくいかないときには、明日つなげて試してみます。
    • good
    • 0

下記のように実行してみるとどうなりますか?



mv *.{png} ABC/
    • good
    • 0

どの位のファイル数があるんでしょうか。

エラーになるほどありますか?
とりあえずxargsを使用して回避してみてください。

http://ja.wikipedia.org/wiki/Xargs

この回答への補足

解答ありがとうございます。

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

補足日時:2009/10/30 15:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています