質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.03%

ファイルやフォルダを同ディレクトリ内の特定のフォルダに移動したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,304
カレントディレクトリに
aaa  bbb  ccc  
Backup 
d.java  e.txt

などのフォルダやファイルがあるとします。
この、ディレクトリ内の
Backupフォルダ以外のフォルダ、ファイルをターミナルの命令を使って
Backupフォルダに移動させたいのですがどうすれば良いでしょうか?


何度かターミナルでfindを使って
とりあえずディレクトリを移動させてみたのですがうまくいきません。

find . -type d -maxdepth 1 \( -name 'Backup' \) -prune | xargs -I % mv % ~/test/Backup
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

こういうのはどうでしょう。
 mv `ls | fgrep -v Backup` Backup/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/04 23:53 編集

    素早い回答ありがとうございます。
    望み通りの結果が得られました。

    除外したいディレクトリが複数あったので実際は以下のようにしました。
    mv `ls | fgrep -v Backup | fgrep -v Drive` Backup/

    キャンセル

  • 2015/07/04 23:58

    追加分もそれでOKだと思います。
    除外設定がもっと複雑になる可能性があるようでしたら、事前にバッククォート(` `)の中だけを実行して想定通り除外されるか試してみてください。

    キャンセル

+2

bash 限定ですが。
ls !(Backup|Drive)
mv !(Backup|Drive) Backup/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/05 02:14

    これはbashの設定次第ですね。上記が出来ない場合は、shopt -s extglob を実行してください。

    キャンセル

+1

質問文での試作案の  find と xargs を使う方法 の延長での解決案を考えてみました。

問題を2つに分けます。
 1. カレントフォルダのファイルと、Backup/ 以外のフォルダを find で 列挙する。
 2  上の結果をつかって mv する。
結論としては、次のような指定で解決できるとおもいます。(MacOSX 10.10.4 で確認)

find . -maxdepth 1 \( -type d -not -name '.' -not -name 'Backup' \) -o -type f | xargs -J% mv % Backup/ 

以下に、解決の道筋を説明します。

1. カレントフォルダのファイルと、Backup/ 以外のフォルダを find で 列挙する。
後述の参考情報のページを参照してみつけた方法です。 
find . -maxdepth 1 \( -type d -not -name '.' -not -name 'Backup' \) -o -type f
これで、 "." と "Backup" 以外のフォルダ と ファイルが列挙できるとおもいます。
$ tree .
.
├── Backup
│   ├── a.rb
│   ├── b.rb
│   └── work
│       ├── a.rb
│       └── b.rb
├── a.rb
├── b.rb
└── work
    ├── a.rb
    └── b.rb

$ find . -maxdepth 1 \( -type d -not -name '.' -not -name 'Backup' \) -o -type f 
./a.rb
./b.rb
./work
あとは これを xargx で mv に渡すせばよい。

2  上の結果をつかって mv する

mv のパラメータの最後には Backup を指定する必要があるので、
    xargs -J%  mv % Backup
のようにします。

動作をためす為に
  mv に渡す引数の数も指定
  mv の代わりに echo で試し、かつ -t で エコーさせる
のようにしてみます。
$ find . -maxdepth 1 \( -type d -not -name '.' -not -name 'Backup' \) -o -type f | xargs -n 1 -J%  echo % Backup/ 
./a.rb Backup/
./b.rb Backup/
./work Backup/
では、Backup/* を削除してから cp -fr してみる。
(ここでは mv の代わりに cp で試した。
-n 指定はしないで、できるだけたくさんのパラメータを一度の cp に渡す)
$ rm -fr Backup/*
$ tree
.
├── Backup
├── a.rb
├── b.rb
└── work
    ├── a.rb
    └── b.rb

$ find . -maxdepth 1 \( -type d -not -name '.' -not -name 'Backup' \) -o -type f | xargs -J%  cp -fr  % Backup/ 
$ tree
.
├── Backup
│   ├── a.rb
│   ├── b.rb
│   └── work
│       ├── a.rb
│       └── b.rb
├── a.rb
├── b.rb
└── work
    ├── a.rb
    └── b.rb
うまく動作しているようです。

Backup という意味なら、 mv や cp より 
対象ファイルを tar にまとめて、それを日付け・時刻をつけたファイル名にして Backup フォルダに 保存する
というようなこともかんがえられます。

参考情報
- 特定ディレクトリ以下を除いた find をする方法 http://d.hatena.ne.jp/teramako/20091002/p1
- findで特定のディレクトリを検索対象外(除外)にする http://d.hatena.ne.jp/mrgoofy33/20100823/1282576209
- xargs コマンド https://hydrocul.github.io/wiki/commands/xargs.html
- macでfind-xargsからのcpやmvに引数を渡す http://blog.sanojimaru.com/post/23730690251/mac-find-xargs-cp-mv
- findコマンドで特定のディレクトリ以下を無視する方法 http://mollifier.hatenablog.com/entry/20090115/1231948700

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る