Рейтинг:2

Как мне создать список подпапок в данной папке без полного пути?

флаг gb

В bash-скрипте следующее:

найти /Volumes/SpeedyG -тип d >> файл.txt

... хорошо работает, чтобы перечислить папки по этому пути в текстовом файле,

/Тома/SpeedyG/folder1  
/Тома/SpeedyG/folder2  
/Тома/SpeedyG/folder2

но результаты - полный путь к папке.

Что, если мне просто нужно имя папки без полного пути?


папка1  
папка2  
папка3  
Рейтинг:6
флаг hr

Для реализации GNU найти, вы можете сделать это, используя форматированное действие вывода printf:

          %P Имя файла с именем начальной точки в
                 который был найден удаленным.

Так

найти /Volumes/SpeedyG -type d -printf '%P\n' >> файл.txt

Если вы хотите удалить все ведущие компоненты каталога, вы можете использовать %f вместо . Если у вас есть зш, вы можете сделать то же самое, используя рекурсивную подстановку оболочки и (хвост) квалификатор:

print -rC1 /Volumes/SpeedyG/**/*(ND/:t)

в этом случае вам не нужно найти вообще. С любым POSIX ш, вы всегда можете сделать

найти каталог -type d -exec sh -c '
  for f do printf "%s\n" "${f##*/}"; сделано
' найти-ш {} +
флаг gb
У меня, должно быть, проблема с синтаксисом. Если я запускаю это с моего терминала Mac, я получаю `find: -printf: неизвестный первичный или оператор` Возможно, в OSX это отличается от того, что в Ubuntu.
ojdo avatar
флаг co
@JonGriffith: да, похоже, это так: https://superuser.com/a/293200/238733, а здесь более актуальный ответ (2020 вместо 2011): https://stackoverflow.com /а/61158594/2375855
флаг cn
@JonGriffith Если вы ищете ответы для OSX, а не для Ubuntu, [Unix SE] (https://unix.stackexchange.com/) — гораздо лучшее место для вопросов. [Superuser SE](https://superuser.com/) также может работать.
Рейтинг:0
флаг mx

ГНУ базовое имя удаляет любые ведущие компоненты каталога из полного имени пути.

$ базовое имя /Тома/SpeedyG/folder1
папка1

Чтобы обработать несколько путей, используйте --несколько вариант:

â-aâ
â--несколькоâ
     Поддержите более одного аргумента. Рассматривайте каждый аргумент как ИМЯ.
     При этом необязательный СУФФИКС должен быть указан с помощью â-sâ
     вариант.

$ basename -a /Volumes/SpeedyG/folder1 /Volumes/SpeedyG/folder2 /Volumes/SpeedyG/folder3
папка1
папка2
папка3

В сценарии более эффективный способ удаления самого большого префикса — прибегнуть к расширению параметра следующим образом:

файл="/Тома/SpeedyG/folder1"
файл="${файл##/*/}"

Вы можете использовать это в за петля:

для i в /Volumes/SpeedyG/*
делать
    printf "%s\n" "${i##/*/}"
сделано > $HOME/files.txt

$ кошка ~/files.txt
папка1
папка2
папка3
Рейтинг:0
флаг cn

дерево -di /Volumes/SpeedyG даст вам список только подпапок.

дерево -dia /Volumes/SpeedyG предоставит вам список только подпапок для включения скрытых каталогов.

дерево -diL 1 /Volumes/SpeedyG даст вам список только подпапок 1 уровня.

примечание: если каталог является символической ссылкой на другой каталог, то в этой строке вывода будет показана ссылка и путь к целевому каталогу...
Вы можете устранить его с помощью инструкции grep, например дерево -ди /Volumes/SpeedyG | grep -v "\->"

флаг gb
Я бы предпочел результат, который обрезает ведущий путь, поэтому я получаю все только справа от SpeedyG/
WU-TANG avatar
флаг cn
@JonGriffith Чтобы было ясно, вы говорите, что если вы сделали `tree -di /Volumes/SpeedyG > sampletext.txt`... И вы посмотрите на sampletext.txt, единственное, что нежелательно в файле, это самая первая строчка в нем... верно?
флаг gb
Нет. Каждая строка в txt-файле относится к полному пути к файлам, которые были добавлены в txt, т. е. /Volumes/SpeedyG/folder1. Я хотел бы, чтобы результирующий список был обрезан, чтобы отображать только список всех папок, найденных на этом уровне, поэтому список будет «папка1, папка2, папка3» и т. д.
WU-TANG avatar
флаг cn
@JonGriffith ... У меня не те результаты, которые вы видите ..все, что я вижу, это одно имя подкаталога в строке... На самом деле, если бы я хотел увидеть полный путь, мне пришлось бы вместо этого сделать `tree -fdi /Volumes/SpeedyG`... Но теперь, когда вы упомянули " на этом уровне», я отредактирую для всех, кому это будет полезно. Не знаю, что сказать о том, почему вы видите то, что видите.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.