хотя я использую BASH уже несколько лет, мой опыт работы с bash scripting относительно ограничен.
мой код, как показано ниже. Он должен захватить всю структуру каталогов из текущего каталога и реплицировать ее в $OUTDIR
.
for DIR in `find . -type d -printf ""%P"0"`
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"0"`
и вывод с этой измененной строкой:
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
на каждом файле в следующей аналогичной структуре. Как должен ли я этим заниматься?
Edit: мне нужна структура кода, которая позволит мне запускать несколько строк кода для каждого каталога/файла/цикла. Извините, если я неясно выразился.
устранение: я изначально пробовал:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
это работало отлично по большей части. Однако позже я обнаружил, что, поскольку труба приводит к циклу while, работающему в подэлементе, любые переменные, установленные в цикле, позже были недоступны, что сделало реализацию счетчик ошибок довольно сложный. Мое окончательное решение (от это ответ на так):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
это позже позволило мне условно инкрементировать переменные в цикле, которые останутся доступными позже в сценарии.