BASH从变量打开文件:文件<xxx>不存在

时间:2017-07-17 21:19:53

标签: bash macos

任务描述&amp;问题

我已将符合特定条件的文件列表转储到文本文件中。我使用的命令是:

find . -name "*.logic" | grep -v '.bak' | grep -v 'Project File Backup' > logic_manifest.txt

带有空格的文件名很难自动打开,例如:

./20160314 _ Pop/20160314 _ Pop.logic

我已经用'\'替换空格来逃避它们,但open命令抱怨:

  

文件/ Users / daniel / Music / Logic / 20160314 \ _ \ _Pop / 20160314 \ _ \ _Pop.logic不存在。

当我复制解析后的路径时,在终端中键入open并将其粘贴,文件就会成功打开。

我的BASH脚本:

#!/bin/bash
clear

# file full of file paths, gathered using the find command
#logic_manifest.txt

# For keeping track of which line of the file I'm using
COUNTER=0
it=1

while IFS='' read -r line || [[ -n "$line" ]]; do

  # Increment iterator
  COUNTER=`expr $COUNTER + $it`

  # replace spaces with a black-slash and space
  line=${line// /<>}
  line=${line//<>/'\ '} 

  # print the file name and the line it is on
  echo "Line: $COUNTER $line" 

  #open the file
  open "$line"

  # await key press before moving on to next iterator
  read input </dev/tty
done < "$1"

在语音标记中封装文件名没有帮助

  line=${line// /<>}
  line=${line//<>/'\ '} 
  line="\"$line\""
  

文件/ Users / daniel / Music / Logic /"./ 20160314 \ _ \ Pop / 20160314 \ _ \   Pop.logic“不存在。

也没有将"\${line}"传递给open

问题

启用open命令以成功启动文件需要做什么?

  • 目前,重命名目录和文件名不是一个可行的选择。
  • 文件名中的空格很糟糕,我知道,我把它归结为疯狂的时刻

1 个答案:

答案 0 :(得分:4)

完全没有必要替换line中的任何字符。 这个更简单的循环应该可以正常打开文件:

while IFS='' read -r line; do
  ((COUNTER++))

  echo "Line: $COUNTER $line" 

  open "$line"

  read input </dev/tty
done < "$1"

那就是它。此外:

  

文件名中的空格很糟糕,我知道,我把它归结为疯狂的时刻。

文件名中的空格没有错。 你必须使用正确的引用,这就是全部。

也就是说,如果文件名中没有空格和其他特殊字符,那么您可以编写open $line并且它可以正常工作。 由于它们包含空格,因此必须将变量括在双引号中,如open "$line"中所示。 实际上,强烈建议在命令行参数中使用时将变量括在双引号中。