サブセット内の各ディレクトリで動作する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: {}" \;
答え2
ディレクトリ内のファイルにスペースがない場合:
#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
cd "$SOURCE"
for file in $(ls -d ./201*)
do
echo "File: $file"
done
ディレクトリリストにスペースがあるかどうかわからない場合は、次のようにします。
#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
cd "$SOURCE"
shopt -s nullglob
for filename in 201*;do
if [[ ! -d "$filename" ]];then
echo "$filename"
fi
done
shopt -u nullglob
ディレクトリファイル名が欲しいかどうかはわかりません。それ以外の場合はこれが機能します。
私は空白があるかどうかわからないとき、通常は2番目の方法が好ましい解決策だと思います。