すべてのファイルを現在のディレクトリから上位ディレクトリに移動する方法は?


133

Linuxで現在のディレクトリから上位ディレクトリにすべてのファイルを移動するにはどうすればよいですか?

のようなものを試しましたmv *.*が、うまくいきません。


質問にタグを付け直すのに十分な担当者がいませんが、を提案[linux] [mv] [cwd] [files]したり、同様のことをしたりできますか?
Stephan202

Stephan202のリクエストごとにこの質問のタグを変更しました。
eleven81

回答:


202

あなたが探しているコマンドは

mv * .[^.]* ..

または(詳細については以下を参照):

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

説明:mvコマンドはファイルとディレクトリーを移動します。への最後の引数mvはターゲットです(この場合、ディレクトリはツリーの1ステップ「上」にあります..)。その前の引数はソースファイルとディレクトリです。アスタリスク(*)は、ドットで始まらないすべてのファイルに一致するワイルドカードです。ドットで始まるファイル(ドットファイル)は「非表示」です。これらは、パターンを使用して一致します.[^.]*(以下の編集を参照)。

の詳細については、リンクしたマンページを参照してくださいmv


なぜ.[^.]*代わりに.*

クリス・ヨンセンが正しく指摘:パターン.*も一致します...。これらを移動したくない(できない)ため、これら2つを除くドットで始まるファイル名に一致するパターンを使用することをお勧めします。このパターン.[^.]*は、ドット(2)で始まり、ドットではない文字(3)に続いて0個以上の任意の文字が続くファイル名(1)に一致します。

以下のようPaggasが 指摘する、我々はまた、パターンを追加する必要があるだろう.??*2個のドットで始まるファイルを一致させるために。を使用した代替ソリューションについては、彼の回答を参照してくださいfind

Arjanの答えshopt、ドットファイルに関するこれらの問題をすべて回避するために言及しています。ただし、ダッシュで始まるファイルにはまだ問題があります。また、3つのコマンドが必要です。それでも、私はアイデアが好きです。次のように使用することを提案します。

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

これはshoptサブシェルで実行され(したがって2番目の呼び出しはshopt必要ありません)--、ダッシュで始まるファイルがの引数として解釈されないように使用しますmv


7
を使用.*すると、mvが移動できないことに関する警告/エラーを生成する場合が.あり..ます。mv * .[^.]* ..代わりに試すことができます。
クリスジョンセン

1
@alain:どういたしまして、サイトへようこそ!(ここでの投稿の1つが十分に質問に答えた場合(のみ)、そのようにマークできます。これにより、ポスターに15評価ポイントが追加され、さらに2担当者が追加されます。)
Stephan202

サブシェルで実行される
ショップ

2
*。*構文に害はありません-..などは、chmodとchownおよび "recurse"フラグ、つまりchmod -Rまたはchown -Rと共に使用した場合にのみ危険です。そのような場合、chown。*またはchmod。* 入力しないでください。探しているパスの最上位ディレクトリをchownし、-hを使用します(シンボリックリンクをたどらないでください)。しかし、mv ..は何もしないので、心配する必要はありません。
クリス

1
正しい3つのパターンは*.[^.]*..?*です。2番目は、おそらく .[!.]*古い(POSIX)シェル用です。また読む

42

短い答え:使用

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

長い答え:

コマンド

mv * .* ..

以来、動作しません.*一致させることができます...。しかし、コマンド

mv * .[^.]* ..

.[^.]*一致しないため、..filename!も機能しません。代わりに、私がやることは

mv * .[^.] .??* ..

これ以外のすべて一致する.とは..*始まらないすべてのものにマッチします..[^.]を除いて、ドットで始まるすべての2文字のファイル名と一致します..し、.??*少なくとも3つの文字で、ドットで始まるすべてのファイル名と一致します。

さらに良いことに、あなたは使うことができます

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

whichいグロブハックを回避しmv * .[^.] .??* ..ます!


1
また、-の重要性を忘れていたため、ダッシュで始まるファイル名でコマンドが正しく機能するようにしました。私は含めました-しかし、私の検索結果に。globを使用したより完全な答えは、「mv-*。[^。]。?? * ..」です。
パグガス

+1:..?*コメントに追加するために戻ってきましたが、あなたはすでにそれを処理していました。
クリスジョンセン

1
mv ..をしようとすると、おそらく何が間違っているのでしょうか 単に何もせず、何もできません。他にもコマンドを実行できるコマンド(chmodとchown)がありますが、mvとrmは単に何もしません。または..
クリス

1
これにより、mv:違法オプションが与えられます-t
pal4life 14

1
ボノ、二重ダッシュはmv、それ以上のコマンドオプションの検索を停止するように指示します。中括弧は結果のファイル名です。プラス記号は、結果ごと(つまりファイル名ごと)にexecを実行する代わりに、できるだけ多くの結果を単一のexecに入れます。完全-t..を期すために、これらすべてのファイルを移動するターゲットの宛先を移動するよう指示しています。
isuldor

14

完全を期すために、Bashシェルに隠しファイルを含めるように指示することもできますshopt

shopt -s dotglob
mv -- * ..
shopt -u dotglob

+1。ずっときれい。ただし、少し改善が必要だと思います。私の答えの更新をご覧ください。
Stephan202

8

mvには、使用時に隠しファイルを移動する機能が*ないため、代わりにコピーを使用しないのはなぜですか?

cp -rf . ..

rm -rf *

dotglobbingとfindコマンドの使用の複雑なソリューションに入る必要はありません。


警告同じファイルシステムで移動する場合、ほとんどの場合、実際にファイルをコピーするのではなく、iノードまたはファイルの内容を移動せずにディレクトリエントリのみを更新します。[1 ] も参照してください。cpし、rm代わりにあなたは本当にすべてをコピーしています。
ハスター

6
rsync -a --remove-source-files . ..

rsync は、非常に強力なファイルコピーツールであり、一般に効率的な増分リモートバックアップおよびミラーの実行に使用されます。

上記のコマンドで、我々は言っているrsyncの内容をコピーする.には..

このスイッチ-aは、.サブディレクトリへの再帰を有効にし、他の一般的なオプションを有効にします。

スイッチ--remove-source-filesは、コピーが成功した後にソースファイルを削除するようにrsyncに指示します。つまり、mvコマンドと同様にrsyncを動作させます。


1
もう少し説明がいいでしょう。
ChrisF

確かに、より明確になったことを願っています。
mrucci

--remove-source-files(同期された)ディレクトリは削除されないことに注意してください。
デニス

ニース、受け入れられた解決策は私に-bash: /bin/mv: Argument list too longエラーを与える これは魅力のように機能します。
userlond

2

mv .mvは現在のディレクトリのリンクを解除できないため、最終的に試行は失敗しますmv * ..。cwd内のファイルを移動できます。


2
mv * .??* ../.

*すべての非ドットファイルを取得します。.??*すべてを取得します。少なくとも3バイトの長さのファイル。これはすべての正当なファイルで機能します。とにかくrmではなく、おそらく残したいものがありmvます。

../.以上のいずれかの直接的な利益を提供していません..が、移動・ツー・ディレクトリをやったときに、あなたが望むように、パスに何か問題がある場合、それは、失敗するので、それはに入るためには非常に良い習慣は、あります。たとえば、ディレクトリであると思わmv xyz bletchれる場合は、でより確実にすることができます。 bletchmv xyz bletch/.


2
.[^.]ようなカバーファイルを取得するために追加できます.a
クリスジョンセン

../と../の間に違いはありません。だから私は迷惑を入力しません。スラッシュの後。また、mvとrmの場合、を含めても害はありません。および..リストにあります。つまり、rmと同じように、mv *。* / path / to / file /に怖いものや間違ったものはありません。または-rfも。何もしません。
クリス

2

この最小化されたコマンドは、ほとんどの最新のシェルで機能します。

\mv -- {,.{[^.],??}}* ..

それ以外の場合は、ポータブルソリューションです。

\mv -- * .[^.] .??* ..

特徴:

  1. \は、エイリアスがmvを不必要に変更するのを防ぎます。

  2. -先行するハイフン(-xyz)を含むファイル名がコマンドライン引数として解釈されるのを防ぎます。

  3. 。[^。]は、で始まる2文字のファイル名すべてに一致します。を除く..

  4. 。?? *は、3文字以上の他のすべてのファイル名と一致します。

単純な実装:

  1. 以下は、で始まる隠しUNIXファイル名をスキップします。(.bashrc)。

    mv * ..
    
  2. 以下は、すべてのディレクトリを最終的に現在の作業ディレクトリ($ PWDまたはpwd)の/に戻るように再帰的に試みる..に一致します。 使用しないでください。

    mv .* ..
    

2

これは、パターンを使用することがより正確だ* .[!.] .??*より* .[^.] .??*前者はまた、ksh88ではなどの古いシェルで動作しますので、:

mv -- * .[!.] .??* ..
  • -- 次で始まるファイル名がある場合の問題を防ぐ -
  • * で始まらないすべてのファイル名に一致します .
  • .移動できる/すべきで始まる文字ファイル名はありません
  • .[!.] で始まるすべての2文字のファイル名に一致します .
  • .??* で始まる3文字すべてのファイル名(またはそれ以上)に一致します .

ksh88を使用すると、ファイル名のパターン.[^.]は実際にはファイル名..(常に存在する)および.^(おそらく存在しない)に一致し、希望とは逆の効果があります。


0

検索とgrepも機能します。この種の構造は、findやegrepを変更して、より複雑な条件でファイルを選択する場合に役立ちます。

find -maxdepth 1 | egrep '^./.'         # Returns all files

mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..

0

すべてのファイルを親ディレクトリに移動するための最も簡単なソリューションだと思います。だろう

mv "`ls`" ../

または、隠しファイル/ディレクトリがある場合

つかいます:

mv "`ls -a`" ../ 2>/dev/null

また、あるフォルダーの内容を内部フォルダーtony(say)のいずれかに移動したいとしましょう。

つかいます:

mv "`ls -a`" /tony 2>/dev/null

注意:

"`ls -a`" 

スペースを含むファイルを移動します。

2>/dev/null

およびフォルダもls -a印刷し、それらを移動またはコピーできないため、警告/エラーを抑制するためです。そのため、これらのフォルダでは、移動できないというエラー(2> / dev / nullを使用しない場合)が表示され、残りは非常に快適に移動します。...

ls -a隠しファイルがない場合は回避し、を使用するのが最善lsです。


実行するとどうなるか試してみましたかmv $(ls -a)ls -a出力さ..れるので、現在のディレクトリとその下のディレクトリをタップします。
サミレイン14

ありがとう、@ SamiLaine、私が訂正をした提案をありがとう。しかしmv ls -a ../、必要に応じて機能します。はい、上で述べたようにエラーが表示されますが、それ以外は必要なフォルダ/ファイルを親ディレクトリに移動します。
プラブハットクマールシン14

これは、スペースのあるファイルでは機能しません。
ケノーブ

@kenorbではls、スペースを含むファイルを移動するためにコマンドを二重引用符で囲む必要があります。必要な変更を加えました。指摘してくれてありがとう。
プラブハットクマールシン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.