Ini pasti pertanyaan yang populer tetapi saya tidak dapat menemukan jawabannya.
Cara memindahkan semua file melalui * termasuk file tersembunyi juga ke direktori induk seperti ini:
mv /path/subfolder/* /path/
Ini akan memindahkan semua file ke direktori induk seperti yang diharapkan tetapi tidak akan memindahkan file tersembunyi. Bagaimana cara melakukannya?
cp -r /path/to/source/. /destination
Jawaban:
Anda dapat menemukan serangkaian solusi lengkap tentang ini di jawaban UNIX & Linux untuk Bagaimana Anda memindahkan semua file (termasuk yang tersembunyi) dari satu direktori ke direktori lain? . Ini menunjukkan solusi dalam Bash, zsh, ksh93, standar (POSIX) sh, dll.
Anda dapat menggunakan dua perintah ini secara bersamaan:
Atau semuanya ( terima kasih pfnuesel ):
Yang berkembang menjadi:
(contoh:
echo a{.,}b
meluas kea.b ab
)Perhatikan ini akan menampilkan beberapa peringatan:
Abaikan saja: ini terjadi karena
/path/subfolder/{.,}*
juga meluas ke/path/subfolder/.
dan/path/subfolder/..
, yang merupakan direktori dan direktori induk (Lihat Apa artinya "." Dan ".." saat berada dalam folder? ).Jika Anda hanya ingin menyalin, Anda dapat menggunakan:
Ini akan menyalin semua file, baik yang normal maupun yang tersembunyi, karena
/path/subfolder/.
diperluas ke "semuanya dari direktori ini" (Sumber: Bagaimana cara menyalin dengan cp untuk memasukkan file tersembunyi dan direktori tersembunyi beserta isinya? )sumber
mv /path/subfolder/* /path/subfolder/.* /path/
, tidak benar-benar diperlukan untuk menggabungkan dua perintah menjadi satu.mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
.
menunjukkan direktori saat ini dan..
menunjukkanup
direktori. Anda pasti telah memperhatikan bahwa semua file lainnya dipindahkan.Saya pikir ini yang paling elegan, karena juga tidak mencoba bergerak
..
:sumber
..anything
atau...anything
dll. - stackoverflow.com/a/31438355/2351568 berisi regex yang benar untuk masalah ini. || tetapi bagaimanapun juga menggunakanshopt -s dotglob
masih merupakan solusi yang lebih baik!{a,b}*
akan menemukan semua file yang dimulai dengan a atau b seperti "anatomi" dan "bulldozer". Pertandingan kedua hanyalah pertandingan kosong, setara dengan*
, dan pertandingan pertama setara dengan.[!.]
, di mana grup[!.]
berarti grup TIDAK dimulai dengan a.
. Artinya,.*
tetapi tidak..*
.Anda bisa menyalakan
dotglob
:Untuk mematikan
dotglob
, Anda perlu mengatakan:sumber
man shopt
tidak berfungsi danhelp shopt
sangat singkat. Tapi Anda bisa melakukannyabashman () { man bash | less -p "^ $1 "; }
dan kemudianbashman shopt
membaca semua tentang itu dengan lugas. (Mungkin harus menekan n untuk melompat ke bawah ke perintah jika ada baris yang dimulai dengan shopt, seperti yang saya temukan.)ls
.. jadi bukan yang Anda inginkan, mungkinSolusi alternatif yang lebih sederhana adalah dengan menggunakan
rsync
utilitas:Catatan: Perintah di atas akan menunjukkan apa yang akan diubah. Untuk menjalankan perubahan aktual, hapus
--dry-run
.Keuntungannya adalah folder asli (
subfolder
) akan dihapus serta bagian dari perintah, dan saat menggunakanmv
contoh di sini Anda masih perlu membersihkan folder Anda, belum lagi sakit kepala tambahan untuk menutupi file yang tersembunyi dan tidak tersembunyi dalam satu tempat. pola.Selain itu
rsync
memberikan dukungan untuk menyalin / memindahkan file antara remote dan itu akan memastikan bahwa file disalin persis seperti aslinya (-a
).-u
Parameter yang digunakan akan melewatkan file baru yang ada,-r
masuk kembali ke direktori dan-v
akan meningkatkan verbositas.sumber
sudo
dan--dry-run
, sehingga orang dapat menguji perubahan sebelum menjalankan perintah sebenarnya untuk menghindari potensi kekacauan.Izinkan saya memperkenalkan Anda kepada teman saya "dotglob". Ini menyala dan mati apakah "*" termasuk file tersembunyi atau tidak.
Defaultnya adalah "off".
Yang terbaik adalah menyalakannya kembali ketika Anda selesai jika tidak, Anda akan membingungkan hal-hal yang menganggapnya akan mati.
sumber
Dengan menggunakan
find
perintah yang berhubungan denganmv
perintah, Anda dapat mencegahmv
perintah untuk mencoba memindahkan direktori (misalnya..
dan.
) dan subdirektori. Inilah salah satu opsinya:Ada masalah dengan beberapa jawaban lain yang diberikan. Misalnya, setiap hal berikut akan mencoba memindahkan subdirektori dari jalur sumber:
Juga, 2) termasuk file. dan .. file dan 3) melewatkan file seperti ..foobar, ... barfoo, dll.
Anda dapat menggunakan,,
mv /source/path/{.[!.],..?,}* /destination/path
yang akan menyertakan file yang terlewat oleh 3), tetapi masih akan mencoba untuk memindahkan subdirektori. Menggunakanfind
perintah denganmv
perintah seperti yang saya jelaskan di atas menghilangkan semua masalah ini.sumber
Solusi saya untuk masalah ini ketika saya harus menyalin semua file (termasuk
.
file) ke direktori target yang mempertahankan izin adalah: (timpa jika sudah ada)yes
adalah untuk secara otomatis menimpa file tujuan,r
rekursif,v
verbose,p
mempertahankan izin.Perhatikan bahwa jalur sumber tidak diakhiri dengan a
/
(jadi semua file / direktori dan. File disalin)Direktori tujuan diakhiri dengan
/
saat kita menempatkan konten folder sumber ke tujuan secara keseluruhan.sumber
yes
adalah perintah yang luar biasa untuk digunakan jika Anda ingin mengganti file tujuan, itu tidak selalu diinginkan. Gunakan hanya jika Anda yakin ingin melakukan ini. Juga, apakah ada perbedaan antarayes | cp ...
dancp -f ...
?