У меня есть та же проблема, как был спрошен рассматриваемый, Переименовывают Музыкальные файлы с Недостающими Расширениями файла, и я нашел сценарий предоставленным @Gilles очень образовательный, но к сожалению это не прокладывало себе путь, я ожидал. То, что я искал, было сценарием, который добавит расширение файла ко всем музыкальным файлам без расширения во всех подкаталогах, на всех уровнях, ниже "/path/to/music/directory /". Предложенный параметр командной строки
/path/to/music/directory/{**/,}*
заставляет сценарий пройти все файлы в подкаталогах один уровень ниже "/path/to/music/directory /" но не на уровнях ниже этого. Какой параметр командной строки я должен использовать для пересечения всех файлов на всех уровнях ниже "каталога /"?
Также ценил бы указатель на документацию для
{**/,}*
часть.
BTW, Для заинтересованных исходным ответом. Я нашел, что сценарий работает лучше после того, как я изменил строку
file -i "$@" |
кому:
file --mime-type "$@" |
(Если бы у меня был уровень полномочий, то я дал бы это как комментарий в исходном ответе),
Я думаю, что необходимо только активировать удар 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
, и значение следующие:
шаблон ** используемый в контексте расширения пути будет соответствовать файлам и нулю или большему количеству каталогов и подкаталогов.
Эта опция оболочки не активна по умолчанию в 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
таким образом, Вы видите это **
может расшириться до больше, чем элемент пути.
Я сделал бы что-то вроде этого
#! /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>