私はこのフォルダー構造を持っています:
foo
`----> bar
bar
の内容をfoo
に抽出するにはどうすればよいですか?
私は試した mv -f bar/* .
foo
内から。
-f、-force |上書きする前に尋ねないでください
しかし、「移動できませんでしたbar/ajax
からfoo/ajax
ディレクトリが空でないため」
どうすればこれを解決できますか?
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
を使用してすべてのファイルを移動し、残った空のディレクトリを削除します。
編集:私は長所と短所を示すためにこの回答を改訂しました。
情報は対応するInfoマニュアルに記載されているため、一部のマニュアルページは簡潔です。
おとこ
-f、-force
上書きする前にプロンプトを表示しない
情報
注:
mv
は、宛先の空のディレクトリのみを置き換えます。設定されたディレクトリの競合は、診断によりスキップされます。[...]
-f、-force
宛先ファイルが存在するが、通常は書き込み不可であり、標準入力が端末であり、
-f
または--force
オプションが指定されていない場合、mv
は、ファイルを置き換えるかどうかをユーザーに要求します。 (ファイルを所有しているか、そのディレクトリに対する書き込み権限を持っている可能性があります。)応答が肯定的でない場合、ファイルはスキップされます。
mv
は空でないディレクトリを置き換えることはできませんが、通常は書き込みができないユーザーが所有する既存のファイルを上書きできます(所有者には書き込み権限がありません。引用文を参照してください)。
foo
|-- ajax
`-- bar
`-- ajax
ディレクトリfoo/ajax
とfoo/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
foo/bar/
のコンテンツをfoo/
に1レベル上げるとします。
ソリューションでは このスーパーユーザーの投稿 および serverfaultのこの投稿 を参照します。
Stephan202ユーザーによると 、このタスクを実行する次のコマンドを探しています。
cd /path/to/foo/bar
mv * .[^.]* ..
foo/bar/
内から、次のコマンドを実行することもできるはずです。
(shopt -s dotglob; mv -- * ..)
正しい権限も持っていることを確認してください。必要に応じて、root(Sudo)権限でコマンドを実行します。
この回答に関して質問や問題がある場合はコメントしてください。コマンドを試す前に、提供した各リンクをよく読んでおくことを強くお勧めします。誤解を修正し、投稿を改善するためのフィードバックに感謝します。必要に応じて回答を更新できます。
ベストオブラック!
ディレクトリがある場合foo
それだけを含むディレクトリbar
。 (bar
には他のものを含めることができます)。
そして、foo/bar
→foo
、次に次のようにします:
mv -T foo foo.original
mv -T foo.original/bar foo
rmdir foo.original
あなたは-T
mv
にこのオプションがない場合は、より安全になります。