在使用变量时出现“没有这样的文件或目录”错误(其他情况下正常工作)

5

我是编程新手,刚开始接触bash。 我想要将文件夹和文件列表打印到一个txt文件中,并删除一些被打印的路径以使其更加清晰。 使用以下命令可以实现:

TODAY=$(date +"%Y-%m-%d")
cd
cd Downloads
ls -R ~/Music/iTunes/iTunes\ Media/Music | sed 's/\/Users\/BilPaLo\/Music\/iTunes\/iTunes\ Media\/Music\///g' > music-list-$TODAY.txt

但为了清理它,我想要使用变量,如下所示,
# Creates a string of the date, format YYYY-MM-DD
TODAY="$(date +"%Y-%m-%d")"

# Where my music folders are
MUSIC="$HOME/Music/iTunes/iTunes\ Media/Music/"

# Where I want it to go
DESTINATION="$HOME/Downloads/music-list-"$TODAY".txt"

# Path name to be removed from text file
REMOVED="\/Users\/BilPaLo\/Music\/iTunes\/iTunes\ Media\/Music\/"

ls -R "$MUSIC" > "$DESTINATION"
sed "s/$REMOVED//g" > "$DESTINATION"

但是它给我一个“没有这个文件或目录”的错误,我似乎无法避免。 我确定这段代码还有许多其他问题,但是这个问题我不理解。


在您最后的 sed 命令中添加文件名。 - Cyrus
bash -x yourscript 是你的好朋友。比较它从脚本的错误和正常版本生成的日志,你就会看到问题所在。 - Charles Duffy
顺便说一下,如果你的 foo 或者 bar 值中包含斜杠,请不要使用 s/foo/bar/ 这种写法 -- 只需要选择另一个定界符:s@foo@bar@ 就可以在 foobar 中包含斜杠而无需转义。 - Charles Duffy
顺便提一下,在 MUSIC="$HOME/Music/iTunes/iTunes\ Media/Music/" 中的反斜杠是错误的。引号已经转义了空格,所以您不需要额外加上反斜杠。 - Charles Duffy
在提问之前,请考虑使用 http://shellcheck.net/ 修复所有问题。 - Charles Duffy
显示剩余2条评论
2个回答

2
感谢大家!我遵循了非常必要的格式化建议和@amo-ej1的答案,现在这个可以工作了:
# Creates a string of the date format YYYY-MM-DD
today="$(date +"%Y-%m-%d")"

# Where my music folders are
music="$HOME/Music/iTunes/iTunes Media/Music/"

# Where I want it to go
destination="$HOME/Downloads/music-list-$today.txt"

# Temporary file
temp="$HOME/Downloads/temp.txt"

# Path name to be removed of text file to only leave artist name and album
remove="\\/Users\\/BilPaLo\\/Music\\/iTunes\\/iTunes\\ Media\\/Music\\/"

# lists all children of music and writes it in temp
ls -R "$music" > "$temp" 
# substitutes remove by nothing and writes it in destination
sed "s/$remove//g" "$temp" > "$destination" 

rm $temp #deletes temp

0

首先,在调试bash时,使用-x标志(bash -x script.sh)或在脚本中输入set -x可以帮助您启动bash,这样bash将打印出它正在执行的命令(包括变量扩展),您可以更轻松地发现错误。

在此特定片段中,我们的ls输出被重定向到名为$DESTINATION的文件中,sed将从标准输入读取并写入$DESTINATION。因此,无论您想如何替换oneliner中的管道都是错误的。结果看起来好像您的程序被阻塞了,但是sed只是等待标准输入上的输入。

至于“没有这样的文件或目录”,请尝试使用set -x执行,并仔细检查它正在尝试访问的路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接