Вопрос команды «Найти» -как составить список подкаталогов и файлов в каталоге, не перечисляя базовый каталог

Я ничего не упоминаю, даже экспортную директиву .

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

(Здесь нет $знака --намного лучше!)


(Экспорт может потребоваться для распространения переменной. Нисколько не меняет этих фактов. Положил его обратно!)

-1
03.05.2021, 19:08
2 ответа

не важно.. сам нашел ответ методом проб и ошибок.

find /abc/def/ghi/* -mtime +10 -exec rm -rf {} \;
-5
28.07.2021, 11:35

Вы можете попросить findявно игнорировать путь поиска верхнего -уровня двумя способами.

  1. Используйте стандартный тест -path, чтобы избежать действия на пути поиска верхнего -уровня:

    find /abc/def/ghi ! -path /abc/def/ghi...other tests/actions...
    

    Это находит путь поиска верхнего -уровня, но не выполняет действия по нему, поскольку он точно соответствует пути, используемому в тесте -path. !переворачивает смысл теста.

  2. Используйте нестандартный -, но широко применяемый тест -mindepth:

    find /abc/def/ghi -mindepth 1...other tests/actions...
    

    Это заставляет findигнорировать все имена путей, лежащие на «нулевой глубине», который является путями поиска верхнего -уровня.

  3. Третий способ, который зависит от того, что вы на самом деле хотите делать, это не интересоваться каталогами (, так как поиск верхнего -уровня пути обычно являются путями к каталогам):

    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для выполнения первого поиска в глубину -. Мы делаем это, потому что

  1. Мы не хотим findпытаться войти в каталоги, которые мы только что удалили, и
  2. Каталог может стать пустым после того, как мы удалили в нем другие каталоги.

Вторая команда также пытается запустить 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сценарий, который выполняет итерацию по каталогам и для каждого каталога пытается развернуть в нем шаблон подстановки *. Если он раскрывается без имен, каталог удаляется.

0
28.07.2021, 11:35

Теги

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