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


75

考慮してください:

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ですか?


mv ../public-back/templates/* public / templates /

mv -R ../public-back/templates/* public/templates/私はまだ質問を移動するために投票します。

2
mv:無効なオプション-R @Vladislav Zorov

3
私はcp -a ../public-back/templates/ public /を行いました

回答:


92

私が質問を誤解していない限り、これはうまくいくでしょう:

mv /public-back/templates/* /public/templates

また、ファイルの膨大なリストがない限り、追加-iは何かを上書きする前に確認します*


14
これは隠しファイルを移動しません。
アルダ14

2
隠しファイルも移動されるようにdotglobを設定するには、askubuntu.com / a / 259386/358964を参照してください。
mkobit

3
注:これにより、サブディレクトリ内のファイルは上書きされません。あなたは取得しますDirectory not emptyメッセージを。
Armstrongest

ディレクトリ階層を平坦化したようです。元のフォルダー内のフォルダーを保存しませんでした。文字通り同じ構造の元のフォルダーを移動するのではなく、すべてのファイルが同じフォルダーに配置されました。
ロバートノアック

このソリューションは機能しますが、このエラーが表示された場合:mv: target '/public/templates' is not a directory宛先フォルダーを手動で作成してください:mkdir /public/templates
アリシャブダー

8

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

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

試してみてください。

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

13
mv用で動きながら、cpためにあるコピー意味論的/語源区別- 。
マリウスブトゥック

cpは、よりもずっと遅いですmvcpコンピューターにディスクからRAMへのすべてのコピーを強制し、ファイルをディスクに再度書き込みます。ファイルのサイズによっては時間がかかる場合があります。ただし、mvリンクのみを書き換える必要があるため、常に即座に発生します。
-tjespe

4

サムドライブから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.

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


2

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

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

許可とすべてを保持します。

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


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

したがって、宛先ディレクトリにハードリンクを作成し、ソースディレクトリを削除します。「mv」は単にあなたのケースでは機能せず、一般にソースdirとdestに共通のサブツリーがない場合にのみ機能します。

質問の「移動」という言葉は、操作後にソースディレクトリを削除する必要があることを意味していると仮定していることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.