Bash - forループからスペースを含む文字列を取得する

Bash - forループからスペースを含む文字列を取得する

サブセット内の各ディレクトリで動作するbashスクリプトを作成しようとしています。残念ながら、パスにスペースが含まれているため、名前を変更できません。

ループはforすべてのスペースで中断を必要とします。何十ものバリエーションを試しましたが、解決策が見つかりませんでした。

簡略化されたバージョンは次のとおりです。

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
for file in `ls -d "$SOURCE"/201*`
do
    echo "File: $file"
done

/Volumes/Time Machine Backups/Backups.backupdb/Zaphod/2017-06-30-215735たとえば、別の変数から各項目を取得する方法を提案できる人はいますか?

ベストアンサー1

最小限に変更される解決策は次のとおりです。

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
for file in "$SOURCE"/201*
do
    echo "File: $file"
done

他のオプション(位置パラメータを変更することが問題にならない場合):

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
set -- "$SOURCE"/201*
for file; do
    echo "File: $file"
done

より正確な解決策はディレクトリを避け、空白のあるファイルを処理します(改行ではありません)。

ls -dp "$a"/201* | grep -v '/$' | 
    while read f; do echo "File:$f"; done

または、すべての名前に対して機能しますが、ドットファイルもリストできる解決策(名前が一致する場合):

find "$a" -type f -name "201*" -exec echo "File: {}" \;

おすすめ記事