よくある質問ですが、答えが見つかりませんでした。
次のように、隠しファイルを含むすべてのファイルを*を介して親ディレクトリに移動する方法:
mv /path/subfolder/* /path/
これにより、期待どおりすべてのファイルが親ディレクトリに移動しますが、隠しファイルは移動しません。どうやってするか?
よくある質問ですが、答えが見つかりませんでした。
次のように、隠しファイルを含むすべてのファイルを*を介して親ディレクトリに移動する方法:
mv /path/subfolder/* /path/
これにより、期待どおりすべてのファイルが親ディレクトリに移動しますが、隠しファイルは移動しません。どうやってするか?
回答:
これに関する包括的なソリューションセットは、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でコピーする方法は?)
mv /path/subfolder/* /path/subfolder/.* /path/
、2つのコマンドを1つに結合するために厳密に必要なわけではありません。
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
.
現在のディレクトリを..
示し、ディレクトリを示しup
ます。他のすべてのファイルが移動されていることに気づいたはずです。
これも移動しようとしないため、これが最もエレガントだと思います..
。
mv /source/path/{.[!.],}* /destination/path
..anything
、...anything
などのファイルを見逃します。- stackoverflow.com/a/31438355/2351568には、この問題の正しい正規表現が含まれています。|| とにかく使用することshopt -s dotglob
はまだより良い解決策です!
{a,b}*
「anatomy」や「bulldozer」など、aまたはbで始まるすべてのファイルを検索します。2番目の一致は空の一致で、と同等です。*
最初の一致はと同等です.[!.]
。ここで、グループと[!.]
は、で始まっていないグループを意味し.
ます。これは意味します.*
が、そうではありません..*
。
これにより、期待どおりすべてのファイルが親ディレクトリに移動しますが、隠しファイルは移動しません。どうやってするか?
あなたはオンにすることができますdotglob
:
shopt -s dotglob # This would cause mv below to match hidden files
mv /path/subfolder/* /path/
をオフdotglob
にするには、次のように言う必要があります。
shopt -u dotglob
man shopt
機能せず、help shopt
非常に簡単です。しかし、あなたはbashman () { man bash | less -p "^ $1 "; }
それbashman shopt
を行うことができ、それについてすべてを簡単に読むことができます。(私が見つけたように、shoptで始まる行がある場合、コマンドにジャンプするにはnを押す必要がある場合があります。)
ls
..のような他のすべてのコマンドにも影響します。したがって、おそらく望んでいるものとはおそらく
別の簡単な解決策は、rsync
ユーティリティを使用することです:
sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/
注:上記のコマンドは、何が変更されるかを示します。実際の変更を実行するには、を削除し--dry-run
ます。
利点は、元のフォルダー(subfolder
)がコマンドの一部と同様に削除されるmv
ことです。ここで例を使用するときは、フォルダーをクリーンアップする必要があります。1つの単一の隠しファイルと非隠しファイルをカバーするための追加の頭痛は言うまでもありません。パターン。
さらにrsync
、リモート間でのファイルのコピー/移動のサポートを提供し、ファイルが元のとおりにコピーされるようにします(-a
)。
使用される-u
パラメータは、既存の新しいファイルをスキップ-r
し、ディレクトリに再帰し、-v
詳細度を高めます。
sudo
した--dry-run
ので、混乱を回避するために、実際のコマンドを実行する前に変更をテストできます。
友達の「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
完了したらオンに戻すことをお勧めします。そうしないと、オフになると想定していることを混乱させます。
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/path
3)で見逃したファイルを含むを使用することもできますが、それでもサブディレクトリを移動しようとします。上記で説明したfind
コマンドとコマンドを併用すると、mv
これらの問題がすべて解消されます。
すべてのファイル(.
ファイルを含む)を権限を保持しているターゲットディレクトリにコピーする必要がある場合のこの問題の解決策は次のとおりです(既に存在する場合は上書きします)。
yes | cp -rvp /source/directory /destination/directory/
yes
宛先ファイルを自動的に上書きするためのもので、
r
再帰的で、
v
詳細で、
p
権限を保持します。
ソースパスの末尾がaではない/
ことに注意してください(すべてのファイル/ディレクトリと。ファイルがコピーされます)。
/
ソースフォルダのコンテンツを全体として宛先に配置するため、宛先ディレクトリは終了します。
yes
あなたは先のファイルを上書きしたい場合に使用する素晴らしいコマンドで、常に希望されません。これを実行したい場合にのみ使用してください。また、とには違いがyes | cp ...
ありcp -f ...
ますか?
cp -r /path/to/source/. /destination