シェルスクリプトで空白を含むファイル名を処理する


1

これらは私のフォルダ構造です。

[set symbolic links here]
/links/

[entity]    
/data/a 1/  #(folder name has blank)
/data/b 1/
/data/c 1/
/data/d 1/
.
.
.

シェルスクリプトで各エンティティのシンボリックリンクを一度に作成したいです。

for file in /data/*; do
    echo "${file}"
   ln -ds "/data/${file}" "/links/${file}"
done

ただし、このようなエラーが表示されます。

/data/a 1
ln: failed to create symbolic link '/data//links/a 1': No such file or directory

私はフォルダ名の空白に関連すると思います.... ???

どうすれば解決できますか?


ファイル名を引用符で囲むだけです。ln -ds "/data/"${file}"" "/link/"${file}""
C0deDaedalus

回答:


1

/data//links/a 1エラーメッセージにあることを確認しますか?私は期待するだろう/links//data/a 1...

空白は問題ではありません。あなたechoが与えたものを参照してください。あなたは$fileすでに含まれている/data/文字列を。コードの一部

"/data/${file}" "/links/${file}"

既にある場所に文字列を追加/data/または追加します。/links//data/

最も簡単な解決策は、$fileまったく含ま/data/れないようにすることです。

cd /data
for file in *; do
# the rest of your script
# in general remember you're in a different dir now

またはfor file in /data/*;、後で余分な部分を保持して削除することもできます。

for file in /data/*; do
file=$(basename "$file")
# the rest of your script

上記のソリューションbasenameは、別個の実行可能ファイルであるため、複数のプロセスを生成します。このため、シェル自体でジョブを実行したい場合があります。

for file in /data/*; do
file="${file##*/}"
# the rest of your script

構文は${file##*/}出力します$file*/、その先頭から最長の文字列を削除します。効果は、最後の後にあるものをあなたに与えることです/


cdはスクリプトの先頭で使用し、動作します!! 正確な説明をありがとうございます。もっと注意深くあるべきです。
ホワイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.