Linuxで現在のディレクトリから上位ディレクトリにすべてのファイルを移動するにはどうすればよいですか?
のようなものを試しましたmv *.*
が、うまくいきません。
Linuxで現在のディレクトリから上位ディレクトリにすべてのファイルを移動するにはどうすればよいですか?
のようなものを試しましたmv *.*
が、うまくいきません。
回答:
あなたが探しているコマンドは
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
。
.*
すると、mvが移動できないことに関する警告/エラーを生成する場合が.
あり..
ます。mv * .[^.]* ..
代わりに試すことができます。
短い答え:使用
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
長い答え:
コマンド
mv * .* ..
以来、動作しません.*
一致させることができます.
と..
。しかし、コマンド
mv * .[^.]* ..
.[^.]*
一致しないため、..filename
!も機能しません。代わりに、私がやることは
mv * .[^.] .??* ..
これ以外のすべて一致する.
とは..
。*
始まらないすべてのものにマッチします.
、.[^.]
を除いて、ドットで始まるすべての2文字のファイル名と一致します..
し、.??*
少なくとも3つの文字で、ドットで始まるすべてのファイル名と一致します。
さらに良いことに、あなたは使うことができます
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
whichいグロブハックを回避しmv * .[^.] .??* ..
ます!
..?*
コメントに追加するために戻ってきましたが、あなたはすでにそれを処理していました。
mv
、それ以上のコマンドオプションの検索を停止するように指示します。中括弧は結果のファイル名です。プラス記号は、結果ごと(つまりファイル名ごと)にexecを実行する代わりに、できるだけ多くの結果を単一のexecに入れます。完全-t..
を期すために、これらすべてのファイルを移動するターゲットの宛先を移動するよう指示しています。
完全を期すために、Bashシェルに隠しファイルを含めるように指示することもできますshopt
。
shopt -s dotglob
mv -- * ..
shopt -u dotglob
mvには、使用時に隠しファイルを移動する機能が*
ないため、代わりにコピーを使用しないのはなぜですか?
cp -rf . ..
rm -rf *
dotglobbingとfindコマンドの使用の複雑なソリューションに入る必要はありません。
rsync -a --remove-source-files . ..
rsync
は、非常に強力なファイルコピーツールであり、一般に効率的な増分リモートバックアップおよびミラーの実行に使用されます。
上記のコマンドで、我々は言っているrsync
の内容をコピーする.
には..
このスイッチ-a
は、.
サブディレクトリへの再帰を有効にし、他の一般的なオプションを有効にします。
スイッチ--remove-source-files
は、コピーが成功した後にソースファイルを削除するようにrsyncに指示します。つまり、mv
コマンドと同様にrsyncを動作させます。
--remove-source-files
(同期された)ディレクトリは削除されないことに注意してください。
-bash: /bin/mv: Argument list too long
エラーを与える これは魅力のように機能します。
mv .
mvは現在のディレクトリのリンクを解除できないため、最終的に試行は失敗しますmv * ..
。cwd内のファイルを移動できます。
mv * .??* ../.
*
すべての非ドットファイルを取得します。.??*
すべてを取得します。少なくとも3バイトの長さのファイル。これはすべての正当なファイルで機能します。とにかくrm
ではなく、おそらく残したいものがありmv
ます。
../.
以上のいずれかの直接的な利益を提供していません..
が、移動・ツー・ディレクトリをやったときに、あなたが望むように、パスに何か問題がある場合、それは、失敗するので、それはに入るためには非常に良い習慣は、あります。たとえば、ディレクトリであると思わmv xyz bletch
れる場合は、でより確実にすることができます。 bletch
mv xyz bletch/.
.[^.]
ようなカバーファイルを取得するために追加できます.a
。
この最小化されたコマンドは、ほとんどの最新のシェルで機能します。
\mv -- {,.{[^.],??}}* ..
それ以外の場合は、ポータブルソリューションです。
\mv -- * .[^.] .??* ..
特徴:
\は、エイリアスがmvを不必要に変更するのを防ぎます。
-先行するハイフン(-xyz)を含むファイル名がコマンドライン引数として解釈されるのを防ぎます。
。[^。]は、で始まる2文字のファイル名すべてに一致します。を除く..
。?? *は、3文字以上の他のすべてのファイル名と一致します。
単純な実装:
以下は、で始まる隠しUNIXファイル名をスキップします。(.bashrc)。
mv * ..
以下は、すべてのディレクトリを最終的に現在の作業ディレクトリ($ PWDまたはpwd)の/に戻るように再帰的に試みる..に一致します。 使用しないでください。
mv .* ..
これは、パターンを使用することがより正確だ* .[!.] .??*
より* .[^.] .??*
前者はまた、ksh88ではなどの古いシェルで動作しますので、:
mv -- * .[!.] .??* ..
--
次で始まるファイル名がある場合の問題を防ぐ -
*
で始まらないすべてのファイル名に一致します .
.
移動できる/すべきで始まる文字ファイル名はありません.[!.]
で始まるすべての2文字のファイル名に一致します .
.??*
で始まる3文字すべてのファイル名(またはそれ以上)に一致します .
ksh88を使用すると、ファイル名のパターン.[^.]
は実際にはファイル名..
(常に存在する)および.^
(おそらく存在しない)に一致し、希望とは逆の効果があります。
検索とgrepも機能します。この種の構造は、findやegrepを変更して、より複雑な条件でファイルを選択する場合に役立ちます。
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
すべてのファイルを親ディレクトリに移動するための最も簡単なソリューションだと思います。だろう
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
出力さ..
れるので、現在のディレクトリとその下のディレクトリをタップします。
mv ls -a ../
、必要に応じて機能します。はい、上で述べたようにエラーが表示されますが、それ以外は必要なフォルダ/ファイルを親ディレクトリに移動します。
ls
、スペースを含むファイルを移動するためにコマンドを二重引用符で囲む必要があります。必要な変更を加えました。指摘してくれてありがとう。
[linux] [mv] [cwd] [files]
したり、同様のことをしたりできますか?