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
しかし、の出力からファイル名全体(一度に1行)を取得する必要があります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
それ以外は許可されているため、許可する必要があります。