web-dev-qa-db-ja.com

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

これは一般的な質問であるに違いありませんが、答えが見つかりませんでした。

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

mv /path/subfolder/* /path/

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

98
TroodoN-Mike

これに関する包括的なソリューションセットは、UNIXとLinuxの すべてのファイル(非表示を含む)をあるディレクトリから別のディレクトリに移動する方法 の回答にあります。 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{.,}ba.b abに展開されます)

これにより、いくつかの警告が表示されることに注意してください。

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

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


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

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

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

177
fedorqui

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

dotglobをオンにできます。

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

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

shopt -u dotglob
28
devnull

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

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

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

rsync -vuar --delete-after path/subfolder/ path/

利点は、元のフォルダー(subfolder)がコマンドの一部だけでなく削除されることです。ここでmvの例を使用する場合、追加の頭痛は言うまでもなく、フォルダーをクリーンアップする必要があります隠されたファイルと隠されていないファイルを1つのパターンでカバーします。

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

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

4
kenorb

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

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コマンドを併用すると、これらの問題がすべてなくなります。

3
teancum144

私の友人「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

完了したらオンに戻すことをお勧めします。それ以外の場合は、オフになると想定していることを混乱させます。

2
TomOnTime

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

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

yesは宛先ファイルを自動的に上書きするため、rは再帰的、vは冗長、pは許可を保持します。

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

宛先ディレクトリは/で終わりますソースフォルダーの内容を全体として宛先に配置するため。

1
Rajneesh Gadge