cp -r
にディレクトリ内のファイルとディレクトリのコピー絶対すべてを作成する方法
必要条件
私の醜い、しかし働いている、ハックは:
cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user
パターンマッチングを使わずに、これを1つのコマンドですべて実行する方法を教えてください。どのフラグを使う必要がありますか?
ファイルを指定しないでください。
cp -r /etc/skel /home/user
(/home/user
は既に存在してはいけません、そうでなければ/home/user/skel
を作成します。)
新しいフォルダを作成した(または作成しようとしている)とし、フォルダの作成後にそのフォルダにファイルをコピーしたいとします。
mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>
これは/etc/skel
から最初の行に作成された既存のフォルダにすべてのファイル/フォルダを再帰的にコピーします。
これを行う正しい方法は、-T (--no-target-directory)
オプションを使用し、(末尾のスラッシュ、アスタリスクなどを付けずに)フォルダーを再帰的にコピーすることです。
cp -rT /etc/skel /home/user
これは/etc/skel
の内容を(隠しファイルを含む)/home/user
にコピーし、存在しない場合は/home/user
フォルダを作成します。ただし、-T
オプションを指定すると、/etc/skel
フォルダーが存在する場合に、/home/user/skel
の内容が新しいフォルダー/home/user
にコピーされるのを防ぎます。
bash
自体は良い解決策を持っています、それはShell option
を持っています、あなたはcp
、mv
などをすることができます。
shopt -s dotglob # for considering dot files (turn on dot files)
そして
shopt -u dotglob # for don't considering dot files (turn off dot files)
上記の解決策はbash
の標準です
注:
shopt # without argument show status of all Shell options
-u # abbrivation of unset
-s # abbrivation of set
Rsyncを使う:
rsync -rtv source_folder/ destination_folder/
ターゲットディレクトリが存在していても、ソースディレクトリとターゲットディレクトリが同じ名前の場合は、次のように入力します。
cp -R /etc/skel /home/
これにより、/ etc/skelディレクトリが隠しファイルや隠しディレクトリを含めて/ home /にコピーされます。
最終的には、ディレクトリをコピーして1行で名前を変更できます。
cp -R /etc/skel /home/ && mv /home/skel /home/user
rsync
は良いのですが、他の選択肢があります:
cp -a src/ dst/
主な助けから:
-a, --archive
same as -dR --preserve=all
-d same as --no-dereference --preserve=links
-R, -r, --recursive
copy directories recursively
あなたはrsyncを使用することができます。
rsync -aP ./from/dir/ /some/other/directory/
あなたもsshを介してコピーすることができます
rsync -aP ./from/dir/ username@remotehost:/some/other/directory/
使えるフラグはいろいろあります:-a、--archive#archive(-rlptgoD)
-r, --recursive
-l, --links # copy symlinks as links
-p, --perms # preserve permissions
-t, --times # preserve times
-g, --group # preserve group
-o, --owner # preserve owner
-D # --devices --specials
--delete # Delete extra files
You may want to add the -P option to your command.
--partial # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.
-P # The -P option is equivalent to --partial --progress. Its purpose is to make it much easier to specify these two options for a long transfer that may be interrupted.
cp -r /etc/skel/{.,}* /home/user
式{.,}*
には、すべてのファイルとディレクトリが含まれます(これもドットで始まります)。
上記の式を使用したくない場合は、cp
プロパティを使用できます。これは、1つのターゲットフォルダに対して複数のソースを指定する機能です。
cp -r /etc/skel/* /etc/skel/.* /home/user
コマンドラインのトリックがあることに注意してください(少なくともsh、bash、およびksh)で動作します)。単にfromディレクトリの後ろにスラッシュを付けます。 fromディレクトリの内容をtoディレクトリに)入れます(皮肉なことに、singrsync)を使ったときにこのトリックについて最初に学びました。
例:
/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2
/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa
/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa
私はここでGoogledに同じ問題の解決策を求めて来ました、それから私はそれがfindでするのが簡単であることに気づきました。利点は、シェル、またはインストールされていない可能性がある特別なユーティリティには依存しません。
find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;
末尾のスラッシュでトリックを試みましたが、それは私にとってうまくいきませんでした。
この問題に対する私の解決策は、すべてのファイル(.
ファイルを含む)をターゲットディレクトリにコピーする必要がある場合です。許可は次のとおりです。(既に存在する場合は上書きします)
yes | cp -rvp /source/directory /destination/directory/
yes
は自動的に宛先ファイルを上書きするためのもので、r
recursive、v
verbose、p
はパーミッションを保持します。
ソースパスが/
で終わっていないことに注意してください(したがって、すべてのfiles/directoryと。filesがコピーされます)。
ソースフォルダの内容を全体としてdestinationに配置しているので、destinationディレクトリは/
で終わります。
私は、cpが隠しファイルを常にコピーするわけではないことを見てきました。もしあなたがすべてのlinux/unix方言に渡って働くように思われるコマンドが欲しいなら、あなたが使うべきである:
cd /etc/skel
find | cpio -pdumv /home/user