재귀적으로 이동하는 방법``:`` `xargs` 또는 `exec`를 사용하여 특정 값 전달

재귀적으로 이동하는 방법``:`` `xargs` 또는 `exec`를 사용하여 특정 값 전달

<user_id>:를 <group_id>특정 값으로 사용하거나 재귀적으로 이동하려고 합니다 . 출력을 변수에 전달하는 함수를 사용하는 데 어려움이 있습니다. 저는 우분투 20.04를 실행하고 있습니다.xargsexecfindstat

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

( Ddotfile은 숨겨진 파일이 포함되어 있음을 의미하고, 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실행함 ) 훨씬 덜 효율적입니다.chownzsh/files

답변2

GNU Parallel을 사용하면 다음과 같습니다:

find . -type f,d |
  parallel 'chown $(($(stat --printf %u {})+1)):$(($(stat --printf %g {})+1)) {}'

관련 정보