我正在尝试编写一个对子集中的每个目录进行操作的 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
我不清楚你是否想要目录文件名,如果不需要,这就是有效的。
我相信,当您不知道是否有空格时,第二个是通常首选的解决方案。