<user_id>
:를 <group_id>
특정 값으로 사용하거나 재귀적으로 이동하려고 합니다 . 출력을 변수에 전달하는 함수를 사용하는 데 어려움이 있습니다. 저는 우분투 20.04를 실행하고 있습니다.xargs
exec
find
stat
find . -type f,d | xargs chown $(($(stat --printf %u {})+1)):$(($(stat --printf %g {})+1)) {}
stat: cannot stat '{}': No such file or directory
stat: cannot stat '{}': No such file or directory
chown: cannot access '{}': No such file or directory
답변1
여기서는 다음을 사용 합니다 zsh
.
#! /bin/zsh -
# enable the stat builtin (which btw predates GNU stat by several years)
zmodload zsh/stat || exit
# enable chown (and other file manipulation builtin)
zmodload zsh/files || exit
ret=0
for f (./**/*(DN.,/) .) {
stat -LH s $f && # store file attributes in the $s hash/associative array
chown $((s[uid] + 1)):$((s[gid] + 1)) $f || ret=$?
}
exit $ret # report any error in stat()ing or chown()ing files
( D
dotfile은 숨겨진 파일이 포함되어 있음을 의미하고, nullglob은 일반 파일이나 유사한 디렉터리를 찾을 수 없는 경우 N
오류로 처리하지 않음을 의미합니다.).,/
-type f,d
Ubuntu 20.04와 같은 GNU 시스템에서는 다음을 수행할 수도 있습니다.
find . -type f,d -printf '%p\0%U\0%G\0' | # print path, uid, gid as 3
# nul-delimited records
gawk -v RS='\0' -v ORS='\0' '{
file = $0; getline uid; getline gid
print (uid+1) ":" (gid+1); print file}' | # outputs a uid+1:gid+1
# and path record for each file
xargs -r0n2 chown # pass each pair of record to chown
chown
그러나 여기에는 파일당 하나씩 실행하는 작업이 포함되므로 (이 접근 방식에서는 모듈 에 내장된 함수를 zsh
실행함 ) 훨씬 덜 효율적입니다.chown
zsh/files
답변2
GNU Parallel을 사용하면 다음과 같습니다:
find . -type f,d |
parallel 'chown $(($(stat --printf %u {})+1)):$(($(stat --printf %g {})+1)) {}'