Хоча я вже кілька років використовую BASH, мій досвід роботи з сценаріями BASH порівняно обмежений.
Мій код як нижче. Він повинен схопити всю структуру каталогів з поточного каталогу та повторити її $OUTDIR
.
for DIR in `find . -type d -printf "\"%P\"\040"`
do
echo mkdir -p \"${OUTPATH}${DIR}\" # Using echo for debug; working script will simply execute mkdir
echo Created $DIR
done
Проблема в тому, що ось зразок моєї файлової структури:
$ ls
Expect The Impossible-Stellar Kart
Five Iron Frenzy - Cheeses...
Five Score and Seven Years Ago-Relient K
Hello-After Edmund
I Will Go-Starfield
Learning to Breathe-Switchfoot
MMHMM-Relient K
Зверніть увагу на пробіли: -S І for
приймає параметри слово за словом, тому вихід мого сценарію виглядає приблизно так:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Learning"
Created Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot"
Created Breathe-Switchfoot
Але мені це потрібно, щоб схопити цілі назви файлів (по одному рядку за один раз) з виводу find
. Я також спробував find
скласти подвійні лапки навколо кожного імені файлу. Але це не допомагає.
for DIR in `find . -type d -printf "\"%P\"\040"`
І вивести цей змінений рядок:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"""
Created ""
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"Learning"
Created "Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot""
Created Breathe-Switchfoot"
Тепер мені потрібен певний шлях, який я можу повторити через це, тому що я також хочу запустити більш складну команду, що gstreamer
стосується кожного файлу, у такій подібній структурі. Як мені це робити?
Редагувати: мені потрібна структура коду, яка дозволить мені запускати кілька рядків коду для кожного каталогу / файлу / циклу. Вибачте, якщо мені було незрозуміло.
Рішення: Спочатку я спробував:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
Здебільшого це спрацювало чудово. Однак пізніше я виявив, що оскільки в результаті труби цикл у той час працює в нижній частині корпусу, будь-які змінні, встановлені в циклі, пізніше були недоступні, що ускладнило реалізацію лічильника помилок. Моє остаточне рішення (з цієї відповіді на ТАК ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
Пізніше це дозволило мені умовно збільшувати змінні в циклі, які залишатимуться доступними пізніше у сценарії.
/
і недрукованих символів. Але дозволено все, крім цього, /
і \0
тому ви повинні їх дозволити.