隠しファイルを含むすべてのファイルを*経由で親ディレクトリに移動する方法


113

よくある質問ですが、答えが見つかりませんでした。

次のように、隠しファイルを含むすべてのファイルを*を介して親ディレクトリに移動する方法:

mv /path/subfolder/* /path/

これにより、期待どおりすべてのファイルが親ディレクトリに移動しますが、隠しファイルは移動しません。どうやってするか?


1
この質問は持っているSUの複製をさらに正解(ではないが認められた1)で、: cp -r /path/to/source/. /destination
フロリアン

回答:


202

これに関する包括的なソリューションセットは、UNIXとLinuxの回答(すべてのファイル(非表示を含む)を1つのディレクトリから別のディレクトリに移動するにはどうすればよいですか?)にあります。。Bash、zsh、ksh93、標準(POSIX)shなどでのソリューションを示しています。


次の2つのコマンドを一緒に使用できます。

mv /path/subfolder/* /path/   # your current approach
mv /path/subfolder/.* /path/  # this one for hidden files

またはすべて一緒に(pfnueselに感謝):

mv /path/subfolder/{.,}* /path/

これは次のように展開されます。

mv /path/subfolder/* /path/subfolder/.* /path/

(例:にecho a{.,}b展開a.b ab

これにより、いくつかの警告が表示されます。

mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy
mv: cannot remove /path/subfolder/..’: Is a directory

それらを無視するだけです。これは、ディレクトリと親ディレクトリであるand に/path/subfolder/{.,}*も展開されるために発生します(「。」と「..」がフォルダー内にあるときの意味を参照してください)。/path/subfolder/./path/subfolder/..


単にコピーしたい場合は、単に以下を使用できます。

cp -r /path/subfolder/. /path/
#                     ^
#                     note the dot!

これは、/path/subfolder/.「このディレクトリのすべて」に展開されるため、通常のファイルと隠しファイルの両方のすべてのファイルをコピーします(出典:隠しファイルと隠しディレクトリとその内容を含めるためにcpでコピーする方法は?


2
中括弧はのショートカットでありmv /path/subfolder/* /path/subfolder/.* /path/、2つのコマンドを1つに結合するために厳密に必要なわけではありません。
chepner 2013年

7
私は次のエラーを取得する:mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
デヤン

@Dejan無視してください。.現在のディレクトリを..示し、ディレクトリを示しupます。他のすべてのファイルが移動されていることに気づいたはずです。
Debiprasad

中括弧は、すべてのシェルのための作業が、@chepnerコマンド私はそれがするとは思わないでしょうショートカットことを言及する価値
ヘスス・カレラ

7
「警告を無視する」というのは必ずしも良い考えではありません。現在、スクリプトに問題があり、ステップが失敗した場合に実行を停止する必要があります。このソリューションでは常にエラーが発生するため、スクリプトが強制終了されます。mvコマンドが失敗したかどうかを判断する方法が必要です...
MarioVilas

29

これも移動しようとしないため、これが最もエレガントだと思います..

mv /source/path/{.[!.],}* /destination/path

1
ええ、私はそれがそれらのエラーメッセージも与えることに気づきました、素晴らしい発見。
ジョセフアストラハン、2015

これは非常に良い解決策だと思いますが、そのパターンを覚えるのはちょっと難しいです
Dylan B

これは..anything...anythingなどのファイルを見逃します。- stackoverflow.com/a/31438355/2351568には、この問題の正しい正規表現が含まれています。|| とにかく使用することshopt -s dotglobはまだより良い解決策です!
DJCrashdummy 2018

@DylanBはそれを記憶しないでください。これは、コンマで区切られた中括弧内のものと一致することを覚えておいてください。{a,b}*「anatomy」や「bulldozer」など、aまたはbで始まるすべてのファイルを検索します。2番目の一致は空の一致で、と同等です。*最初の一致はと同等です.[!.]。ここで、グループと[!.]は、で始まっていないグループを意味し.ます。これは意味します.*が、そうではありません..*
mazunki

28

これにより、期待どおりすべてのファイルが親ディレクトリに移動しますが、隠しファイルは移動しません。どうやってするか?

あなたはオンにすることができますdotglob

shopt -s dotglob               # This would cause mv below to match hidden files
mv /path/subfolder/* /path/

をオフdotglobにするには、次のように言う必要があります。

shopt -u dotglob

非常に役立ちます。詳細を知りたいのですが、shoptは組み込みなので、man shopt機能せず、help shopt非常に簡単です。しかし、あなたはbashman () { man bash | less -p "^ $1 "; }それbashman shoptを行うことができ、それについてすべてを簡単に読むことができます。(私が見つけたように、shoptで始まる行がある場合、コマンドにジャンプするにはnを押す必要がある場合があります。)
Nick Rice

2
これはls..のような他のすべてのコマンドにも影響します。したがって、おそらく望んでいるものとはおそらく
異なり

5

別の簡単な解決策は、rsyncユーティリティを使用することです:

sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/

注:上記のコマンドは、何が変更されるかを示します。実際の変更を実行するには、を削除し--dry-runます。

利点は、元のフォルダー(subfolder)がコマンドの一部と同様に削除されるmvことです。ここで例を使用するときは、フォルダーをクリーンアップする必要があります。1つの単一の隠しファイルと非隠しファイルをカバーするための追加の頭痛は言うまでもありません。パターン。

さらにrsync、リモート間でのファイルのコピー/移動のサポートを提供し、ファイルが元のとおりにコピーされるようにします(-a)。

使用される-uパラメータは、既存の新しいファイルをスキップ-rし、ディレクトリに再帰し、-v詳細度を高めます。


史上最高のソリューション!私の場合、ルートフォルダーを更新したくないので、-uパラメーターを削除しました。ありがとう
Thales Ceolin

これは、注意を怠ると、Linuxで永続的に混乱する可能性があるコマンドの1つです。rsyncコマンドの前にsudoを含めるように回答を更新してください。そうしないと、ユーザーはmkdirの権限を簡単に拒否できますが、それでもファイルの削除は先に進むため、rsyncコマンドは移動するディレクトリ全体を削除し、それ以外は何もしません。ディレクトリ全体が失われます。sudoを回答に追加すると、これはおそらく受け入れられる回答になるはずです。したがって、コマンドは次のようになります。sudo rsync -vuar --delete-after path / subfolder / path /
Blue Water

@JohnnyBご迷惑をおかけして申し訳ありません。とを追加sudoした--dry-runので、混乱を回避するために、実際のコマンドを実行する前に変更をテストできます。
ケノーブ

ああ、--dry-runオプションがあることに気づかなかった。良い追加。謝罪の必要はありません。これは素晴らしいです。
ブルーウォーター

3

友達の「dotglob」を紹介します。「*」に隠しファイルが含まれているかどうかにかかわらず、オンとオフを切り替えます。

$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. ..  .den  .hi .hidden a b c

$ shopt -u dotglob
$ ls *
a b c
$ for i in * ; do echo I found: $i ; done
I found: a
I found: b
I found: c

$ shopt -s dotglob
$ ls *
.den  .hi .hidden a b c
$ for i in * ; do echo I found: $i ; done
I found: .den
I found: .hi
I found: .hidden
I found: a
I found: b
I found: c

デフォルトは「オフ」です。

$ shopt dotglob
dotglob         off

完了したらオンに戻すことをお勧めします。そうしないと、オフになると想定していることを混乱させます。


3

findコマンドをコマンドと組み合わせて使用することにより、コマンドがディレクトリ(およびなど)およびサブディレクトリを移動しようとするのをmv防ぐことができます。1つのオプションは次のとおりです。mv...

find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;

提供されている他の回答の一部に問題があります。たとえば、次のそれぞれは、ソースパスからサブディレクトリを移動しようとします。

1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/ 
3) mv /source/path/{.[!.],}* /destination/path

また、2)にはが含まれます。および..ファイルおよび3)..foobar、... barfooなどのファイルがありません。

mv /source/path/{.[!.],..?,}* /destination/path3)で見逃したファイルを含むを使用することもできますが、それでもサブディレクトリを移動しようとします。上記で説明したfindコマンドとコマンドを併用すると、mvこれらの問題がすべて解消されます。


2

すべてのファイル.ファイルを含む)を権限を保持しているターゲットディレクトリにコピーする必要がある場合のこの問題の解決策は次のとおりです(既に存在する場合は上書きします)。

yes | cp -rvp /source/directory /destination/directory/

yes宛先ファイルを自動的に上書きするためのもので、 r再帰的で、 v詳細で、 p権限を保持します。

ソースパスの末尾がaではない/ことに注意してください(すべてのファイル/ディレクトリと。ファイルがコピーされます)。

/ソースフォルダのコンテンツを全体として宛先に配置するため、宛先ディレクトリは終了します。


一方でyesあなたは先のファイルを上書きしたい場合に使用する素晴らしいコマンドで、常に希望されません。これを実行したい場合にのみ使用してください。また、とには違いがyes | cp ...ありcp -f ...ますか?
mazunki
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.