Как составить список всех папок в папке и исключить указанную c одну - PullRequest
0 голосов
/ 06 января 2020

Скажем, у меня есть папка, подобная этой:

my_folder

==== my_sub_folder_1

==== my_sub_folder_2

=== = my_sub_folder_3

==== exclude

Мне нужна команда, которая возвращает строку, подобную этой:

["my_sub_folder_1", "my_dub_folder_2", "," my_dub_folder_3 "]

(обратите внимание на исключение папки excude)

Лучшее, что я мог бы сделать:

ls -dxm */

Это возвращает следующее.

my_sub_folder_1 /, my_dub_folder_2 /, my_dub_folder_3 /

Поэтому я все еще пытаюсь удалить / в конце каждой папки, добавить [] и "".

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

Ответы [ 2 ]

2 голосов
/ 06 января 2020

Предполагается, что вы выполняете сценарий в каталоге, к которому относится my_folder, как насчет:

while IFS= read -r -d "" f; do
    ary+=("$f")
done < <(find "my_folder" -maxdepth 1 -mindepth 1 -type d -not -name "exclude" -printf "\"%f\"\0")

(IFS=","; echo "[${ary[*]}]")

[Пояснения]

  • -printf опция find команда указывает формат вывода. Формат "\"%f\"\0" печатает имя файла (исключая начальное имя каталога), заключенное в двойные кавычки и сопровождаемое символом NUL \0.
  • Символ NUL используется в качестве разделителя имени файла, а имена файлов снова разделяются в read встроенный путем указания разделителя для символа NUL с помощью -d "".
  • Затем имена файлов (с двойными кавычками) сохраняются в массиве ary по одному.
  • Наконец, команда echo "[${ary[*]}]" выводит элементы ary, разделенные IFS. Весь вывод заключен в квадратные скобки [].
  • Последняя строка заключена в скобки (), которые должны быть выполнены в подпроцессе. Цель состоит только в том, чтобы не перезаписывать текущий IFS.

Если вы сохраните сценарий в моем ответе как my_script.sh, то вы можете присвоить выходной переменной MY_VAR, сказав:

MY_VAR=$(./my_script.sh)
echo "$MY_VAR"
# or another_command "$MY_VAR" or whatever

В качестве альтернативы вы можете назначить переменную в сценарии, изменив последнюю строку следующим образом:

MY_VAR=$(IFS=","; echo "[${ary[*]}]")
echo "$MY_VAR"

Надеюсь, это поможет.

1 голос
/ 06 января 2020

В bash это можно сделать следующим образом, оно близко, но не работает в одной строке.

Измените разделитель внутреннего поля на новую строку, а не на пробел. Это позволяет игнорировать пробелы в именах каталогов.

Затем выполните следующее:

  • Выведите список каталогов, по одному на строку
  • Используйте grep для удаления каталога в быть исключенным
  • Перебрать результаты:

    • Вывести имя каталога с последним удаленным символом
  • Труба все, что нужно xargs для рекомбинации в одну строку и сохранения в $ var

  • Обрезать последние, из $ {var} и переносить в '[]'
IFS=$'\n'
var=`for d in \`ls -d1 */ | grep -v exclude_dir \`; do  echo '\"'${d::-1}'\",' ; done | xargs`
echo '['${var::-1}']'
...