Хотя я использую 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 в подоболочке, все переменные, установленные в цикле, впоследствии были недоступны, что затрудняло реализацию счетчика ошибок. Мое окончательное решение (из этого ответа на SO ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
Позже это позволило мне условно увеличивать переменные в цикле, которые позже будут доступны в скрипте.
/
и непечатаемых символов. Но разрешено все, кроме вас, /
и \0
вы должны их разрешить.