web-dev-qa-db-ja.com

フォルダのコンテンツを現在のフォルダに移動するにはどうすればよいですか?

私はこのフォルダー構造を持っています:

foo
`----> bar

barの内容をfooに抽出するにはどうすればよいですか?

私は試した mv -f bar/* .foo内から。

-f、-force |上書きする前に尋ねないでください

しかし、「移動できませんでしたbar/ajaxからfoo/ajaxディレクトリが空でないため」

どうすればこれを解決できますか?

5
Black

mvはファイルを上書きしますが、上書きは拒否されますディレクトリ。ディレクトリをマージしてソースディレクトリを削除する単一のコマンドはありません(おそらくmvで必要なコマンドです)。でもrsync --remove-source-filesは空のディレクトリを残します。

コマンドを組み合わせて使用​​できます。

cp -a dev/. .
rm -r dev

devのすべてを現在のディレクトリにコピーし、devディレクトリを削除します。

または:

rsync -a --remove-source-files dev/ .
find dev -depth -type d -exec rmdir {} \;

rsyncを使用してすべてのファイルを移動し、残った空のディレクトリを削除します。

8
muru

編集:私は長所と短所を示すためにこの回答を改訂しました。

情報は対応するInfoマニュアルに記載されているため、一部のマニュアルページは簡潔です。

おとこ

-f、-force

上書きする前にプロンプ​​トを表示しない

情報

注:mvは、宛先の空のディレクトリのみを置き換えます。設定されたディレクトリの競合は、診断によりスキップされます。

[...]

-f、-force

宛先ファイルが存在するが、通常は書き込み不可であり、標準入力が端末であり、-fまたは--forceオプションが指定されていない場合、mvは、ファイルを置き換えるかどうかをユーザーに要求します。 (ファイルを所有しているか、そのディレクトリに対する書き込み権限を持っている可能性があります。)応答が肯定的でない場合、ファイルはスキップされます。

mvは空でないディレクトリを置き換えることはできませんが、通常は書き込みができないユーザーが所有する既存のファイルを上書きできます(所有者には書き込み権限がありません。引用文を参照してください)。

foo    
|-- ajax
`-- bar
    `-- ajax

ディレクトリfoo/ajaxfoo/bar/ajaxをマージして、すべてのファイルを保持するか、 @ mur で提案されているように同一ファイルを上書きすることができます。

ただし、これらのディレクトリの内容が無関係である場合、この方法は不適切です。一見するとわかりにくいので、新しい木を見てみましょう。

Prompt% tree home/network
home/network/
├── data
│   ├── img
│   │   └── demo.png
│   └── src
│       ├── contact.pdf
│       └── report.pdf
├── hardware
│   ├── api
│   ├── docs
│   └── src
│       └── driver.c
├── misc
│   └── src
│       └── init.py
├── README
└── src
    ├── main.c
    └── manager.c

network/dataの内容をnetworkに移動し、同じ名前のディレクトリをマージすることを選択できます(以下のc.f.)。

Prompt% cp -ab home/network/data/* home/network
Prompt% rm -r home/network/data/*
Prompt% tree home/network
home/network/
├── data
├── hardware
│   ├── api
│   ├── docs
│   └── src
│       └── driver.c
├── img
│   └── demo.png
├── misc
│   └── src
│       └── init.py
├── README
└── src
    ├── contact.pdf
    ├── main.c
    ├── manager.c
    └── report.pdf

ご覧のとおり、最終ディレクトリnetwork/srcには、移動後に無関係なファイルが含まれている可能性があります。望ましくない場合は、移動後に同じ名前のファイルとディレクトリの名前を変更できます。

Prompt% mv -b -S "_data" home/network/data/* home/network
Prompt% tree home/network
home/network/
|-- README
|-- data
|-- hardware
|   |-- api
|   |-- docs
|   `-- src
|       `-- driver.c
|-- lib
|   `-- demo.png
|-- misc
|   `-- src
|       `-- init.py
|-- src
|   |-- contact.pdf
|   `-- report.pdf
`-- src_data
    |-- main.c
    `-- manager.c
1
Fólkvangr

手元の問題

foo/bar/のコンテンツをfoo/に1レベル上げるとします。

ソリューションでは このスーパーユーザーの投稿 および serverfaultのこの投稿 を参照します。

解決

Stephan202ユーザーによると 、このタスクを実行する次のコマンドを探しています。

cd /path/to/foo/bar
mv * .[^.]* ..

foo/bar/内から、次のコマンドを実行することもできるはずです。

(shopt -s dotglob; mv -- * ..)

正しい権限も持っていることを確認してください。必要に応じて、root(Sudo)権限でコマンドを実行します。

結論

この回答に関して質問や問題がある場合はコメントしてください。コマンドを試す前に、提供した各リンクをよく読んでおくことを強くお勧めします。誤解を修正し、投稿を改善するためのフィードバックに感謝します。必要に応じて回答を更新できます。

ベストオブラック!

1
kemotep

ディレクトリがある場合fooそれだけを含むディレクトリbar。 (barには他のものを含めることができます)。

そして、foo/barfoo、次に次のようにします:

mv -T foo foo.original
mv -T foo.original/bar foo
rmdir foo.original

あなたは-Tmvにこのオプションがない場合は、より安全になります。

0
ctrl-alt-delor