Salin izin file, tetapi bukan file di Unix

14

(Dari: /programming/15245144/copy-file-permissions-but-not-files , ditutup karena di luar topik)

Saya memiliki dua salinan dari pohon direktori yang sama. Mereka hampir memiliki file yang sama di keduanya (satu versi mungkin memiliki beberapa file tambahan atau hilang). Namun, sebagian besar file memiliki kesamaan untuk kedua direktori (memiliki jalur relatif yang sama dan semuanya).

Asumsikan ini ada di direktori:

version1/
version2/

Masalahnya adalah bahwa izin dalam versi1 / kacau, dan saya ingin menyalin izin dari versi2 /, tetapi melakukannya tanpa mengganti file di versi1 / yang lebih baru.

Apakah ada cara otomatis untuk melakukan ini melalui perintah atau skrip shell?

Mariano Paniga
sumber
Di sini ada skrip yang berguna dalam perl yang dapat Anda gunakan serverfault.com/questions/373058/...
NoNoNo

Jawaban:

15

GNU cp mengetahui --attributes-onlyflag sejak coreutils 8.6

--attributes-only jangan menyalin data file, hanya atribut

Tom Aac
sumber
1
Versi saya tampaknya tidak memiliki bendera itu, dan beberapa pos tampaknya memiliki peringatan yang menakutkan misalnya.
shearn89
14

Versi saya cptidak memiliki --attributes-onlybendera, jadi saya mengerjakannya. Diuji secara singkat pada folder sederhana, YMMV.

$> ls
version1/
version2/
$> ls -l version1/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a
$> ls -l version2/1/a
-rwxrwxrwx 1 alex alex 0 Feb  5 12:49 version1/1/a

$> find version1 -type f -printf '%P\n' | xargs -I {} \
    chmod --reference=version1/{} version2/{}

$> ls -l version2/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a
shearn89
sumber
5

Anda bisa, tetapi saya tidak berpikir dengan "cara otomatis"!

GNU chown dan GNU chmod memiliki --reference=RFILEparameter yang dapat Anda gunakan.

chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile

Ini menggunakan RFILEpengaturan (izin, pemilik, grup, dll.) Dan menyalinnya ke yourfile.

manual menjelaskan lebih detail.

Feiticeir0
sumber
0

Dalam kasus saya, saya menyelesaikannya dengan menggunakan perintah "stat" dengan "find" dan "vi" untuk membuat skrip yang menerapkan izin.

cd version1/
find . -exec stat -c '%a %n' "{}" \; > setPerm.sh
vi setPerm.sh

Ke dalam "vi" saya memasukkan ke dalam semua baris perintah "chmod": %s/^/chmod /g Saya menyalin script di version2/direktori dan menjalankannya.

Solusi lain tampaknya valid tetapi saya tidak mengujinya untuk berjaga-jaga.

Mariano Paniga
sumber
0

Terinspirasi oleh jawaban Mariano Paniga, saya pikir saya punya yang lebih baik, yang tidak perlu vi dan mencari / mengganti perintah. Saya bahkan ingin menyalin info kepemilikan juga (uid / gid).

cd version1/
find . -exec stat -c 'chmod %a %n; chown %U:%G %n' "{}" \; > /tmp/setPerm.sh
chmod u+x /tmp/setPerm.sh
cd ../version2
/tmp/setPerm.sh

Anda dapat menyesuaikan perintah di dalam stat -c '...'menjadi apa pun yang Anda inginkan. Untuk semua opsi yang tersedia, lihat man stat.

Tomofumi
sumber
Apakah skrip Anda menangani nama dengan baris baru yang disematkan?
Pemburu Rusa
@ rusa-pemburu Ini harus berfungsi apa adanya, jika tidak, Anda dapat menambahkan kutipan ".." di sekitar bagian nama file.
Tomofumi