サブフォルダー内のすべてのファイル(非表示を含む)を* nixの親フォルダーに再帰的に移動する方法は?


14

これは少し恥ずかしい質問ですが、これが私のキャリアの後半にまだmvコマンドに関する質問があることを認めなければなりません。

この問題は頻繁に発生します。すべてのファイルを1レベル上に再帰的に移動する必要があります。fooというフォルダーと、その中にフォルダーバーがあるとします。バーには、ドットファイルやフォルダーなど、さまざまなファイルやフォルダーがあります。barのすべてをfooレベルに移動するにはどうすればよいですか?

fooが空の場合、バーを1レベル上に移動し、fooを削除してbarをfooに名前変更します。問題の一部は、「ドットを含むすべて」のmvのワイルドカードが何であるかわからないことです。この質問の一部はこれです-cpおよびmvコマンドがどこかで使用するワイルドカードの詳細な議論があります(これをグーグルにすると、非常に基本的なチュートリアルが表示されます)。

回答:


19

Bash(および他の一部)では、ブレース展開を使用してこれを1行で実行できます。

mv bar/{,.}* .

カンマはヌルとドットを区切るので、mvコマンドは一致するファイル名*.*


これも「..」を移動しようとしますが、「リソースがビジーです」というメッセージで失敗します。それでも動作します。
ザナナックス

3
匿名ユーザーによる提案:To eliminate the error caused by also matching "." and "..", use this command: mv bar/{,.[!.],..?}* .
HopelessN00b

2

これを行う最も簡単な方法は、*が.whateverと一致しないため、2つのコマンドで実行することです。

cd /foo
mv bar/* ./
mv bar/.??* ./

この間違いを犯している間に見つけたbar /.*を使いたくありません:

rm -rf ./.* 

これは悪いことです。誰が理由を推測したいですか?;-)


BashやZsh .*.andに展開されるとは思わない..。Zshは少なくとも私には向いていません。
ミカエルS

ミカエル:私はbashがない(あるいは少なくともやった)約束することができ、私は私だけでは行うことによって一掃することをユーザディレクトリを回復するために持っていたとして
マット・シモンズ

2

グロビングについて最初に知っておくべきことは、コマンドではなくシェルによって行われます。詳細については、シェルのマニュアルページを確認してください。


2

これは、サブフォルダーからすべてのファイルを収集し、それらを現在のディレクトリに移動します

find . -type f -exec mv -iv \{} . \;

同じ名前のファイルを書き込みたい場合は、

yes y | find . -type f -exec mv -iv \{} . \;

1

mv .??* *ドットとそれに続く1文字を除くすべてを処理します。それがあなたの状況に共通している場合、追加でき.[a-zA-Z0-9]*ます。それはまだのような名前のファイルを残して.;.^、および.^I(タブ)。すべてを処理する必要がある場合は、もう少し複雑になる必要があります。

mv .. `ls -f | egrep -v '^.$|^..$'

0

ディレクトリ構造が/foo/bar/ありbar、上記の1ステップですべてのファイルを移動する場合は、ディレクトリに移動しbarて次を入力します。

find . -depth -print0 | cpio --null -pvd ../

一般的に、cpio(1)この種のタスクには適していると思います。info cpioシェルで発行することにより、詳細なドキュメントを確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.