これは一般的な質問であるに違いありませんが、答えが見つかりませんでした。
次のように、隠しファイルも含めてすべてのファイルを親ディレクトリに移動する方法:
mv /path/subfolder/* /path/
これにより、すべてのファイルが期待どおりに親ディレクトリに移動しますが、隠しファイルは移動しません。どうやってするか?
これに関する包括的なソリューションセットは、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{.,}b
はa.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でコピーする方法 )
これにより、すべてのファイルが期待どおりに親ディレクトリに移動しますが、隠しファイルは移動しません。どうやってするか?
dotglob
をオンにできます。
shopt -s dotglob # This would cause mv below to match hidden files
mv /path/subfolder/* /path/
dotglob
をオフにするには、次のように言う必要があります。
shopt -u dotglob
..
を移動しようとしないため、これが最もエレガントだと思います。
mv /source/path/{.[!.],}* /destination/path
別の簡単な解決策は、rsync
ユーティリティを使用することです。
rsync -vuar --delete-after path/subfolder/ path/
利点は、元のフォルダー(subfolder
)がコマンドの一部だけでなく削除されることです。ここでmv
の例を使用する場合、追加の頭痛は言うまでもなく、フォルダーをクリーンアップする必要があります隠されたファイルと隠されていないファイルを1つのパターンでカバーします。
さらに、rsync
は、リモート間でのファイルのコピー/移動のサポートを提供し、ファイルが元の状態(-a
)で正確にコピーされるようにします。
使用される-u
パラメータは既存の新しいファイルをスキップし、-r
はディレクトリに再帰し、-v
は冗長性を高めます。
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
コマンドを併用すると、これらの問題がすべてなくなります。
私の友人「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
完了したらオンに戻すことをお勧めします。それ以外の場合は、オフになると想定していることを混乱させます。
すべてのファイルをコピーする(.
ファイルを含む)をターゲットディレクトリにコピーする必要がある場合のこの問題の解決策権限を保持する:(既に存在する場合は上書きする)
yes | cp -rvp /source/directory /destination/directory/
yes
は宛先ファイルを自動的に上書きするため、r
は再帰的、v
は冗長、p
は許可を保持します。
ソースパスが/
で終わっていないことに注意してください(したがって、すべてのファイル/ディレクトリと。ファイルがコピーされます)
宛先ディレクトリは/
で終わりますソースフォルダーの内容を全体として宛先に配置するため。