Czy istnieje polecenie lub flaga do sklonowania własności / uprawnień użytkownika / grupy do pliku z innego pliku? Czy chcesz, aby perms i własność były dokładnie takie same jak w innym pliku?
Czy istnieje polecenie lub flaga do sklonowania własności / uprawnień użytkownika / grupy do pliku z innego pliku? Czy chcesz, aby perms i własność były dokładnie takie same jak w innym pliku?
Odpowiedzi:
Na GNU / Linux chown
i chmod
mają --reference
opcję
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
parametr chmod
i chown
wcześniej :).
Na dowolnym Uniksie z narzędziami GNU, takim jak (niewbudowany) Linux lub Cygwin, możesz używać chmod --reference
ichown --reference
.
Jeśli twój system ma listy ACL , spróbuj poleceń ACL getfacl
i setfacl
. Te polecenia różnią się nieco w zależności od systemu, ale w wielu przypadkach można użyć getfacl other_file | setfacl -bnM - file_to_change
do skopiowania uprawnień. To nie kopiuje własności; możesz to zrobić ostrożnie analizując ls -l other_file
, zakładając, że nie masz nazw użytkowników ani grup zawierających spacje.
LC_ALL=C ls -l other_file | {
read -r permissions links user group stuff;
chown -- "$user:$group" file_to_change
}
getfacl other_file | setfacl -bnM - file_to_change
Zrobił polecenia bash na podstawie reakcji Matteo :)
Kod:
chmod $( stat -f '%p' "$1" ) "${@:2}"
Stosowanie:
cp-permissions <from> <to>...
${*:2}
? Nigdy więcej tego nie rób! To się nie powiedzie, jeśli którakolwiek z nazw plików zawiera spację (lub tabulatory). Użyj "${@:2}"
. Użyj "$1"
zamiast tego $1
.
chmod "$(stat -c '%a' "$fromfile")" tofile
w GNU Coreutils, ale równie dobrze możesz użyć --reference
w tym przypadku, ponieważ stat
narzędzie CLI nie jest POSIX, mówi nawet pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.htmlto ls -l
tego nie da: „Wyjście ls (z opcją -l i powiązanymi opcjami) zawiera informacje, które logicznie mogłyby zostać wykorzystane przez narzędzia takie jak chmod i touch, aby przywrócić pliki do znanego stanu. Jednak informacje te są przedstawione w formacie, który nie może być użyty bezpośrednio przez te narzędzia lub być łatwo przetłumaczone na format, którego można użyć. ”
Jeśli nie używasz systemu z chmod / chown GNU (które obsługują tę --reference
opcję), możesz spróbować przeanalizować wynikls -l
Oto mały skrypt dla chmod
(jeśli widzisz, który obsługuje rozszerzone wyrażenia regularne, można je napisać w znacznie bardziej czytelny sposób ...)
#!/bin/sh
reference=$1
shift
files=$*
# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )
chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}
AKTUALIZACJA :
Jest to jeszcze łatwiejsze przy użyciu stat
:
chmod $( stat -f '%p' ${reference} ) ${files}
ls -l
dane wyjściowe, możesz przeanalizować stat
dane wyjściowe.
stat
tutaj składni * BSD . Twoje chmod $(stat ...)
polecenie nie będzie działać, ponieważ %p
samo wypisuje za dużo informacji dla * BSD chmod
, użyj %Lp
do wyprowadzenia tylko bitów u / g / o. W przypadku lepkich / setuid / setgid bitów wymagane byłoby coś nieco bardziej skomplikowanego.
Chciałem dodać korektę do skryptu Matteo . Należy użyć pętli for, aby sprawdzić, czy pliki istnieją przed uruchomieniem na nich komendy chmod. Pozwoli to na bardziej płynny błąd skryptu.
Myślę, że jest to najlepsza opcja, ponieważ można jej używać we wszystkich systemach operacyjnych * nix, takich jak Solaris, Linux itp.
#!/bin/sh
reference=$1
shift
files=$*
for file in $reference $files; do
[ -f $file ] || { echo "$file does not exist"; exit 1; }
done
# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )
chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}
Odkryłem, że na jednym z moich komputerów Solaris 10 stat
nie został znaleziony. Może to być problem z moją konfiguracją.
To działa dla mnie:
cp -p --attributes-only <from> <to>