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: {}" \;

答案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

我不清楚你是否想要目录文件名,如果不需要,这就是有效的。

我相信,当您不知道是否有空格时,第二个是通常首选的解决方案。

相关内容