Как рекурсивно сдвинуть ` `:` `на определенное значение, используя `xargs `или `exec`

При использовании GNU Parallel это выглядит так:

parallel --plus iRep -f Bins/{/...}_bin.* -s {} --sort -o {/...}_iRep_output ::: sam/*.sam.sorted.sam
1
26.10.2020, 13:29
2 ответа

С GNU Parallel это выглядит так:

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

Я бы использовал 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 — включить скрытые файлы, Nдля nullglob — не считать это ошибкой, если файл не найден .,/является обычным или каталогом, например-type f,d).

Если в системе GNU, такой как Ubuntu 20.04, вы также можете:

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), это будет намного менее эффективно..

1
18.03.2021, 22:54

Теги

Похожие вопросы