Pindahkan file dan folder secara rekursif di Linux

75

Mempertimbangkan:

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

Bagaimana cara memindahkan konten /public-back/templatessecara rekursif dengan izin /public/templates?

silikonpi
sumber
mv ../public-back/templates/* publik / templates /
mv -R ../public-back/templates/* public/templates/Saya masih memilih untuk memindahkan pertanyaan.
2
mv: opsi tidak valid - R @Vladislav Zorov
3
saya melakukan cp -a ../public-back/templates/ publik /

Jawaban:

92

Kecuali jika saya salah memahami pertanyaan, ini akan berhasil:

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

Juga, kecuali Anda memiliki daftar file yang besar, menambahkan -iakan bertanya sebelum menimpa apa pun, yang menambah keamanan saat menggunakan wildcard seperti *.

DQdlM
sumber
14
Ini tidak memindahkan file tersembunyi.
Arda
2
Lihat askubuntu.com/a/259386/358964 untuk mengatur dotglob sehingga file yang tersembunyi juga akan dipindahkan.
mkobit
3
Catatan: Ini tidak akan menimpa file dalam subdirektori. Anda akan mendapat Directory not emptypesan.
Armstrongest
Tampaknya itu meratakan hierarki direktori. Tidak menyimpan folder dalam folder asli untuk saya. Semua file berakhir di folder yang sama, daripada benar-benar memindahkan folder asli dengan struktur yang sama.
Robert Noack
Solusi ini bekerja, tetapi jika Anda melihat kesalahan ini: mv: target '/public/templates' is not a directoryhanya membuat folder tujuan secara manual: mkdir /public/templates.
Ali Shabdar
8

Halaman manual untuk status cp:

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

Mencoba;

cp -rp /public-back/templates/* /public/templates/
Himalay
sumber
13
mvadalah untuk bergerak , sedangkan cpuntuk salinan - perbedaan semantik / etimologis.
Marius Butuc
cpjauh lebih lambat daripada mv. cpmemaksa komputer untuk menyalin segala sesuatu dari disk ke RAM, dan kemudian menulisnya ke disk lagi yang mungkin memakan waktu lama tergantung pada ukuran file. Namun, mvselalu terjadi secara instan karena hanya tautan yang harus ditulis ulang.
tjespe
4

Saat memindahkan item dari thumb drive saya ke sistem OSMC saya, saya menemukan hal berikut ini sangat berguna:

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

Penjelasan tentang cara kerjanya di bawah ini.

BTW, Jangan lupa untuk menambahkan garis miring terbalik sebelum spasi di nama direktori sumber atau tujuan (lihat di atas).

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.

Secara efektif, Anda menemukan semua file dan semua folder dan memindahkannya satu per satu (atau jika suatu direktori ditemukan pertama kali, Anda memindahkan direktori itu dan konten di dalamnya). Ini memulai proses baru untuk setiap gerakan dan sangat tidak efisien. Gunakan ini hanya ketika perintah biasa gagal.

Pi Hard
sumber
2

mv tampaknya tidak melakukan ini. Tapi Anda bisa menggunakan trik kecil ini, bekerja seperti pesona:

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

dan mempertahankan izin dan semuanya.

Catatan: tidak ada yang di atas bekerja untuk saya, itu sebabnya solusi ini.

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

Jadi buat tautan keras di direktori tujuan dan hapus dir sumber. 'mv' tidak akan berfungsi dalam kasus Anda, dan secara umum hanya berfungsi ketika sumber dir dan dest tidak memiliki subtree yang sama.

Perhatikan bahwa saya berasumsi bahwa kata 'pindah' ​​dalam pertanyaan berarti bahwa sumber dir harus hilang setelah operasi.

Boudewijn
sumber