find... -exec sh -c 'sh code' {} +
В оболочке bash/ksh запускает команду
find
в новом процессе, который запускает один или несколько вызовов командsh
.sh code
сможет влиять только на переменные вызоваsh
, который интерпретирует этот код (, кстати,sh
не предназначен для поддержки массивов ).Если вы хотите сохранить пути к файлам, найденным с помощью
find
, в массив текущей оболочки, именно эта оболочка должна выполнить назначение.С
bash
4.4+,вы можете сделать это с помощью:readarray -td '' F_ARR < <(find "$CDIR" ! -type d -mtime +7 -print0)
Если ваш
find
не поддерживает-print0
, вы можете заменить его на-exec printf '%s\0' {} +
.(с более старыми версиями
bash
, см. , как вы можете это сделать в этом ответе на аналогичный вопрос).Здесь вы также можете использовать оболочку
zsh
и выполнить:f_arr=($CDIR/**/*(NDm+7^/))
Отличие от вышеизложенного заключается в том, что:
oN
glob, чтобы отключить сортировку $CDIR
сам по себе не будет включен, даже если ему больше 8 дней. $CDIR
является символической ссылкой на каталог, zsh
все равно будет спускаться в него. Поскольку вы отметили свой вопрос как bash
, так и ksh
, обратите внимание, что существуют разные реализации и варианты ksh (ksh88, ksh93, грядущий ksh2020 для (изначально )Дэвид Корн, pdksh и его производные, такие как OpenBSD sh
или mksh
, к которым вы можете добавить режим эмуляции ksh )zsh.
Большинство функций bash
исходят из ksh88
и ksh93
, некоторые — из zsh
и mksh
. readarray
— одна из немногих функций, встроенных в bash
и не встречающихся больше нигде.
ksh93 добавил параметр -d
к read
в 1993 году, позже скопированный bash (2000 )zsh (2003 )и mksh (2011 ), но только bash, zsh, mksh и ksh2020 могут использовать его с пустым разделителем для обработки записей с разделителями NUL. Подстановка процесса была добавлена в ksh86 (1986 ), но ни один из вариантов ksh на основе pdksh -не поддерживает ее, поэтому методы, упомянутые выше для старых версий bash
, не будут работать ни в одной версии ksh. (кроме режима эмуляции ksh zsh ).
В оболочках на основе ksh88, ksh93 и pdksh -один из вариантов — опубликовать -обработку вывода find
, чтобы он сгенерировал код оболочки, который может определить этот массив и оценить этот код с помощьюeval
:
eval set -A F_ARR "$(
LC_ALL=C find "$CDIR" ! -type d -exec awk -v q="'" -- '
BEGIN {
for (i = 1; i < ARGC; i++) {
gsub(q, q "\\" q q, ARGV[i])
printf " %s", q ARGV[i] q
}
exit
}' {} +
)"
(здесь предполагается, что $CDIR
не начинается с +
или -
. Если это возможно, с некоторыми реализациями ksh
вы можете использовать set -A F_ARR --
. В любом случае, если он начинается с -
, find
подавится им ).
Такой же подход можно использовать для любого POSIX sh, заменив set -A F_ARR
на set --
, что затем заполнит один массив оболочек POSIX:"$@"
.
Запустите grep -i apt /var/log/syslog
и проверьте наличие автоматического задания, которое обновляет вашу систему для вас. Если это существует, то это может объяснить, почему ваш собственный двоичный файл заменяется в подсистеме alternatives
. Предположительно, вы хотите остановить это
update-alternatives --config editor 0<&-; echo
There are 4 choices for the alternative editor (providing /usr/bin/editor).
Selection Path Priority Status
------------------------------------------------------------
* 0 /bin/nano 40 auto mode
1 /bin/ed -100 manual mode
2 /bin/nano 40 manual mode
3 /usr/bin/vim.nox 40 manual mode
4 /usr/bin/vim.tiny 15 manual mode
Press <enter> to keep the current choice[*], or type selection number:
Если вы еще этого не сделали, установите собственный двоичный файл в набор конфигурации
update-alternatives --install /usr/bin/editor editor /usr/local/bin/vim 1
Однако, если вы повторно -запустите команду --config
(выше ), вы увидите, что вы еще не переключились на свой собственный двоичный файл. Сделайте это, и альтернативная подсистема увидит выбор manual
и перестанет изменять настройку под вами. Я думаю, что это, возможно, был шаг, который вы пропустили
update-alternatives --set editor /usr/local/bin/vim