• 締切済み

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

  • ファイルの移動コマンド

    linux初心者です。 以下のようなコマンドを打ちました。 mv -f *.jpg /images /test/img やりたいことはimagesフォルダ内の.jpgファイルを全てimgフォルダに移動させたいのです。 この場合、imagesフォルダごとimgフォルダに移動されました。 しかもエラーメッセージ mv: cannot stat `*.jpg': そのようなファイルやディレクトリはありません が表示されます。 色々と調べてみたのですが初心者なので、どうすればよいか困っています。

  • linux(redhat)ファイルシステムの復旧について

    お疲れ様です。 Linux(redhat)環境で、あるフォルダ配下をフォルダごとルート直下に移動しようとして以下のmvコマンドを投入しました。 >mv /opt/xxx/test /* コマンドの指定方法に誤りがあったのか、この後lsなどのコマンドが効かなくなってしまいました。 >/bin/ls:そのようなファイルやディレクトリはありません cdコマンドで/opt配下には移動はできるのですが、/binなどは壊れてしまったのか、移動もできません。 /bin配下のコマンドが効かず何もできない状態なのですが、何とか復旧させる手段はないでしょうか。OSを再インストールするしかないでしょうか。 ご存じの方おりましたらよろしくお願いいたします。

  • 【Linux】シェルの実行方法を教えて下さい。

    【Linux】シェルの実行方法を教えて下さい。 ファイルの中身が#!/bin/bashで始まる拡張子shのシェルがあります。 これを実行するには、どのようなコマンドを打てばよいのでしょうか? 1.rootでログイン。 2.test.shがあるフォルダに、cdで移動する。 3.test.shと入力し、Enterキーを押す。 ↑みたいな感じで良いのでしょうか。 テスト用サーバなので、最悪壊しても良いと上司に言われましたが、 なにぶん時間がないため質問させていただきました。 Redhatでバージョンが3か4だったと思います。 よろしくお願いします。

  • tar zcf  で Argument list too long のエラーが出る

    aaa下の中身を圧縮して test.tar.gz を作り、これを bbb下に移動させるのを 以下のようにshで行っています。 #!/bin/bash cd /aaa tar zcf test.tar.gz * mv test.tar.gz /bbb これを、なにか圧縮コマンドのオプションを使って 圧縮元と圧縮ファイル作成先を指定して、1行で済ますことは出来ますか? tar zcf /bbb/test.tar.gz /aaa/*   を試してみましたが、 -bash: /bin/tar: Argument list too long と出てしまいます。ご教授宜しく御願いいたします。

  • Linuxサーバーでの引数に拡張子があるものの渡し方

    PHPのプログラミングで、URL形式の引数に拡張子(たとえば、.jpgなど)を持ったものを渡そうとすると、WindowsサーバなどではOKなのですが、Linuxの場合、404エラー(そのディレクトリやファイルがない)になってしまうようなのですが、Linuxサーバーでの拡張子のあるものを引数として渡したい場合、どういった書き方をすればいいのでしょうか?

    • ベストアンサー
    • PHP
  • linuxでのファイル移動

    現在geanyというエディタで作業してます。他のエディタでもそうなんですが、何故かsudoコマンドからだと日本語入力できません。 sudo無しだと日本語入力できますが、これだとファイルをフォルダに移動できず困っています。 どうしたらsudoコマンドから日本語入力出来ますか?? もしくはどうしたら、ファイルを移動できますか? 環境はubuntu11.10

  • ファイルが移動できません。

    ファイルを移動しようとすると下記のように表示されます。 $ mv hello.php /opt/lampp/htdocs mv: `hello.php' を `/opt/lampp/htdocs/hello.php' に移動できません: 許可がありません 解決方法を教えてください。 お願いします。

  • シェルスクリプトに引数を渡す方法?

    次のようなシェルスクリプトを作り、バッチ処理で実行したいのですが、うまくいかず困っています。 %ls test.sh data %less test.sh #!/bin/sh calc.exe input=$1 コマンドから通常実行するときは、 % test.sh data でうまく行きます。 これを、qsubを使ったバッチ処理で実行しなければならなくて、 %qsub test.sh data とすると、qsubは引数を1つしか取れないので、構文エラーとなり、うまく入力引数"data"を渡せません。 %qsub "test.sh data" %qsub 'test.sh data' で、引数を1つにしようとしましたが、ダメでした。 引数ファイル名"data"は、名前が変わるので、できるだけ可変になるようにしたいです。 どなたか、解決法もしくは、参考URLなど教えてください。

  • Linuxのファイルサーバーに移らないファイルがある?

    できるLINUXという本を読み、イントラネットサーバを立てました。 特に問題ないと思うのですが、ファイルサーバーとして利用してみようと思い、windowsのパソコンからLINUXのpublicとしたフォルダへ、ファイルを移しています。  ところが、うまく移す事ができないファイルがあるのです。 何故なのでしょうか。 移るものは、すんなりと行くのですが、できないファイルはいつも特定のものです。 エラーメッセージとして、 [LINUXのpublicの移動先のフォルダ名]は存在しません。作成しますか。→(一応、はいで抜ける) もう一度、上と同じメッセージが出る。→(また、はいで抜ける) [移したいファイル名]を作成または置換できません。既に存在するファイルを作成する事はできません。” と、出ます。 よろしくお願いします! 追伸、移らないファイルを英文字に変えたら、うまくいきました。 しかし、漢字交じりのファイル名でもすんなり移るものもあります。 基本的にファイル名に漢字は用いない方がいい、という事なのでしょうか? また、漢字のファイル名が使用できるような良い方法は何かあるのでしょうか。

  • linux シェルの変数、引数の指定について教えて

    シェルの勉強を始めまして、 ファイルを複合化、解凍するだけのシェルを作ろうと思っています。 fukugo.sh $1 でシェルを実行 /home/allday/log/upload/201701261507(←ログの作られる時間で変わります)aaaaa.tar.gz.e というファイルを$1引数に指定 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー !/bin/sh # # init CWD=$(cd $(dirname $0) && pwd) #cd ${CWD} # if [ -z $1 ] then echo "引数を指定してください" exit fi echo "Start" echo "指定されたtarファイルを複合化します" fukugo-decrypt $1 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー fukugo-decryptは私の会社で使われているtarを複合化するコマンドです(環境変数?) 複合化すると /home/allday/log/upload/201701261507aaaaa.tar.gz というファイルになります。 このできたファイルをシェルに入れる次のコマンドの引数にしたいです。 が最後の.eが無くなるため$1では指定できないと思います。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー echo "複合化されたファイルを/tmpフォルダに入れておきます" mv /home/allday/log/upload/201701261507aaaaa.tar.gz /tmp/ echo "ファイルを展開します" tar zxvf /tmp/201701261507aaaaa.tar.gz echo "End" ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 複合化された後の/home/allday/log/upload/201701261507aaaaa.tar.gzや 移動後の/tmp/201701261507aaaaa.tar.gzは変数で設定するとよいと聞いたのですが、 どのように設定すればよいかわかりません。 お分かりになる方、お願いします。 教えてください。