我已将符合特定条件的文件列表转储到文本文件中。我使用的命令是:
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并将其粘贴,文件就会成功打开。
#!/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命令以成功启动文件需要做什么?
答案 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"
中所示。
实际上,强烈建议在命令行参数中使用时将变量括在双引号中。