Какая командная строка надежно пересечь несколько уровней каталога

У меня есть та же проблема, как был спрошен рассматриваемый, Переименовывают Музыкальные файлы с Недостающими Расширениями файла, и я нашел сценарий предоставленным @Gilles очень образовательный, но к сожалению это не прокладывало себе путь, я ожидал. То, что я искал, было сценарием, который добавит расширение файла ко всем музыкальным файлам без расширения во всех подкаталогах, на всех уровнях, ниже "/path/to/music/directory /". Предложенный параметр командной строки

/path/to/music/directory/{**/,}*

заставляет сценарий пройти все файлы в подкаталогах один уровень ниже "/path/to/music/directory /" но не на уровнях ниже этого. Какой параметр командной строки я должен использовать для пересечения всех файлов на всех уровнях ниже "каталога /"?

Также ценил бы указатель на документацию для

{**/,}* 

часть.

BTW, Для заинтересованных исходным ответом. Я нашел, что сценарий работает лучше после того, как я изменил строку

file -i "$@" |

кому:

file --mime-type "$@" | 

(Если бы у меня был уровень полномочий, то я дал бы это как комментарий в исходном ответе),

0
задан 13 April 2017 в 15:24

2 ответа

Я думаю, что необходимо только активировать удар globstar опция, потому что это не активно по умолчанию в Ubuntu, как объяснено в следующем.

Выражение /path/to/music/directory/{**/,}* содержите две конструкции расширения: имеет расширение фигурной скобки и затем расширение пути.

Расширение фигурной скобки

Расширение фигурной скобки лучше всего объяснено с примером:

$ printf '%s\n' before-{a,bb,1,22}-after
before-a-after
before-bb-after
before-1-after
before-22-after

(Я использовал, здесь и в следующем, команде printf '%s\n' item1 item2 etc.. это похоже echo но печать каждый элемент на новой строке)

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

Исходный пример, содержа в фигурных скобках элементы **/ и пустой элемент, расширяется до

$ printf '%s\n' /path/to/music/directory/{**/,}*
/path/to/music/directory/**/*
/path/to/music/directory/*

Globstar

Обратитесь теперь к шарику удара **, это упоминается два раза в странице руководства удара, обоих относительно опции оболочки globstar, и значение следующие:

шаблон ** используемый в контексте расширения пути будет соответствовать файлам и нулю или большему количеству каталогов и подкаталогов.

Эта опция оболочки не активна по умолчанию в Ubuntu:

$ shopt globstar
globstar        off

Можно активировать его

shopt -s globstar

(используйте shopt -u globstar деактивировать его).

Если у нас есть следующая структура каталогов:

$ find first/ | sort
first/
first/aaa
first/second
first/second/bbb01
first/second/bbb02
first/second/third
first/second/third/ccc1
first/second/third/ccc2
first/second/third/ccc3

у нас могли быть следующие расширения:

$ printf '%s\n' first/**/a*
first/aaa

$ printf '%s\n' first/**/b*
first/second/bbb01
first/second/bbb02

$ printf '%s\n' first/**/c*
first/second/third/ccc1
first/second/third/ccc2
first/second/third/ccc3

таким образом, Вы видите это ** может расшириться до больше, чем элемент пути.

1
ответ дан 22 December 2019 в 14:10

Я сделал бы что-то вроде этого

#! /bin/bash

[[ -d "$1" ]] || { echo "$1 not a directory, exiting..."; exit 1; }

find "$1" -type f | while read F; do
  # do what you want with the "$F"
done

exit 0

и затем вызовите сценарий через ./my_script <directory>

1
ответ дан 22 December 2019 в 14:10

Другие вопросы по тегам:

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