web-dev-qa-db-ja.com

Linuxでファイルとフォルダを再帰的に移動する

検討してください:

ls -al ../public-back
drwxrwxr-x  4 Apache   Apache     4096 Apr 19 03:32 templates

ls -al ../public-back/templates

drwxrwxr-x  2 Apache   Apache    4096 Apr 19 03:33 content
drwxrwxr-x  2 Apache   Apache   20480 Apr 20 06:14 images
drwxrwxr-x  2 Apache   Apache    4096 Apr 19 03:35 video

ls -al /public

drwxrwxr-x  4 Apache   Apache     4096 Apr 20 09:49 templates

ls -al /public/templates

drwxrwxr-x  2 Apache   Apache    4096 Apr 20 09:50 content
drwxrwxr-x  2 Apache   Apache    4096 Apr 20 09:50 images
drwxrwxr-x  2 Apache   Apache    4096 Apr 20 09:50 video

パーミッション付きで/public-back/templatesの内容を/public/templatesに再帰的に移動するにはどうすればよいですか?

71
siliconpi

誤解しない限り、これでうまくいきます。

__コード__

また、巨大なファイルのリストがない限り、mv /public-back/templates/* /public/templates を追加すると上書きされる前に-iが要求されます。これにより、*のようなワイルドカードを使用する際の安全性が高まります。

86
KennyPeanuts

Cpのmanページには、次のように記載されています。

-p same as --preserve=mode,ownership,timestamps
-r same as --recursive=copy directories recursively

してみてください。

cp -rp /public-back/templates/* /public/templates/
8
Himalay

私のサムドライブから私のOSMCシステムにアイテムを移動するとき、私は以下が非常に役に立つとわかりました:

find /media/Pi\ Hard\ 16GB/ -name '*' -exec mv -v {} /media/External\ HDD/Videos/ \;

それがどのように動作するかについての説明は以下にあります。

ところで、ソースまたはデスティネーションディレクトリ名のスペースの前にバックスラッシュを追加することを忘れないでください(上記参照)。

find  finds all files and folders in the destination path.

/media/Pi Hard 16GB/ is the path searched. Escape special char such as spaces.

-name '*' filters on names. If you do not escape or quote this then 
          the Shell will expand it before find sees it.

-exec     Executes a command, in our case mv

-v        Verbose, so you can see what's happening (optional)

{}        is replaced by the name of the found object.

事実上、あなたはすべてのファイルとすべてのフォルダを見つけてそれらを一つずつ移動させています(あるいはディレクトリが最初に見つけられた場合、あなたはそのディレクトリとその中のコンテンツを移動しています)。これは各動きのための新しいプロセスを始め、非常に非能率的です。通常のコマンドが失敗した場合にのみこれを使用してください。

3
Pi Hard

mvはこれをしていないようです。しかし、あなたはこの小さなトリックを使うことができます、魅力のように働きます:

tar cf - . |(cd /targetdir; tar xvf -)

そして権限とすべてを保持します。

注:上記のどれも私のために働きませんでした、それがこの回避策である理由です。

2
svye
cp -a --link ../public-back/* /public/.  &&  rm -rf ../public-back

そのため、インストール先ディレクトリにハードリンクを作成し、ソースディレクトリを削除します。 'mv'は単にあなたのケースではうまくいきません、そして一般的にはsource dirとdestが共通のサブツリーを持たないときだけうまくいきます。

質問の中の「移動」という言葉は、ソースディレクトリが操作後に削除されることを意味していると思います。

0
Boudewijn