Я ничего не упоминаю, даже экспортную директиву .
FREESURFER_HOME=freesurfer
В других языках это было бы просто $FREESURFER_HOME = "freesurfer"
, присвоение строки. В bash вы решаете при каждом использовании, имеете ли вы в виду строку или значение переменной
$ echo FREESURFER_HOME
FREESURFER_HOME
$ echo $FREESURFER_HOME
freesurfer
Знак доллара — это способ сообщить bash, что вы имеете в виду значение/содержимое этого имени.
После установки переменной вы можете использовать ее (со знаком доллара)
source $FREESURFER_HOME/SetUpFreeSurfer.sh
— это то, для чего вам нужна эта переменная. Вы хотите запустить/использовать определенный скрипт в модифицированном домашнем каталоге fs -. Для одного вызова это точно так же, как source freesurfer/SetUpFreeSurfer.sh
, если "freesurfer" является содержимым.
Если вы наберете $FREESURFER_HOME
в качестве команды, (первое слово будет командой! ), оно расширяется до своего значения "freesurf" (или любого другого значения ), и это не существующая команда (-> не найдена ).
В других ситуациях с допустимыми командами в переменных случались плохие вещи.
$ cmd='echo hello'
$ $cmd
hello
Здесь ничего не происходит, это дружественная команда --, но этот вид алиасинга по крайней мере вызывает сомнения. Я думаю, никто этого не делает, это было бы разрушительным . Для обычного псевдонима есть дополнительный встроенный -в:
$ alias cmd='echo hello'
$ cmd
hello
(Здесь нет $
знака --намного лучше!)
(Экспорт может потребоваться для распространения переменной. Нисколько не меняет этих фактов. Положил его обратно!)
не важно.. сам нашел ответ методом проб и ошибок.
find /abc/def/ghi/* -mtime +10 -exec rm -rf {} \;
Вы можете попросить find
явно игнорировать путь поиска верхнего -уровня двумя способами.
Используйте стандартный тест -path
, чтобы избежать действия на пути поиска верхнего -уровня:
find /abc/def/ghi ! -path /abc/def/ghi...other tests/actions...
Это находит путь поиска верхнего -уровня, но не выполняет действия по нему, поскольку он точно соответствует пути, используемому в тесте -path
. !
переворачивает смысл теста.
Используйте нестандартный -, но широко применяемый тест -mindepth
:
find /abc/def/ghi -mindepth 1...other tests/actions...
Это заставляет find
игнорировать все имена путей, лежащие на «нулевой глубине», который является путями поиска верхнего -уровня.
Третий способ, который зависит от того, что вы на самом деле хотите делать, это не интересоваться каталогами (, так как поиск верхнего -уровня пути обычно являются путями к каталогам):
find /abc/def/ghi ! -type d...other tests/actions...
Теперь, глядя на то, что вы хотите сделать, кажется, что вы хотите очистить каталоги, в которые не были добавлены новые вещи или удалено из них за последние 10 дней. Самый безопасный способ сделать это нужно специально просмотреть файлы и удалить файлы, которые Старый. После этого вы можете удалить каталоги, которые оказались пустой.
Причина, по которой вы не хотите полагаться на временные метки каталогов заключается в том, что эти временные метки ничего не говорят о том, когда файлы подкаталогов были добавлены или удалены. Удаление каталога, потому что его временная метка устарела, поэтому он может случайно удалить свежие файлы в нижние подкаталоги.
Я бы, наверное, использовал что-то вроде
find /abc/def/ghi -type f -mtime +10 -delete
find /abc/def/ghi ! -path /abc/def/ghi -type d -empty -delete
! -path /abc/def/ghi
может быть пересмотрено, если вы не возражаете против удаление пути поиска верхнего -уровня, если он был пуст.
Поскольку тест -empty
и действие -delete
не являются стандартными -,ниже показано, как сделать то же самое со стандартнымfind
:
find /abc/def/ghi -type f -mtime +10 -exec rm -f {} +
find /abc/def/ghi -depth ! -path /abc/def/ghi -type d -exec rmdir {} \; 2>/dev/null
Первая команда должна быть прямой. Он собирает старые файлы и вызывает rm -f
для их пакетов.
Вторая команда использует -depth
для выполнения первого поиска в глубину -. Мы делаем это, потому что
find
пытаться войти в каталоги, которые мы только что удалили, и Вторая команда также пытается запустить rmdir
для всех каталогов (, кроме пути поиска верхнего -уровня ). Это приведет к ошибке для не-пустых каталогов, поэтому мы перенаправляем поток ошибок на /dev/null
, чтобы игнорировать диагностические сообщения.
Чтобы вызвать rmdir
только для действительно пустых каталогов, мы можем использовать
find /abc/def/ghi -depth ! -path /abc/def/ghi -type d \
-exec bash -O dotglob -O nullglob -c '
for dirpath do
set -- "$dirpath"/*
[ "$#" -gt 0 ] && rmdir "$dirpath"
done' bash {} +
Это вызывает короткий встроенный bash
сценарий, который выполняет итерацию по каталогам и для каждого каталога пытается развернуть в нем шаблон подстановки *
. Если он раскрывается без имен, каталог удаляется.