Bash 使用变量时没有此类文件或目录错误(否则有效)

Bash 使用变量时没有此类文件或目录错误(否则有效),bash,shell,command-line,Bash,Shell,Command Line,我是编程新手,刚刚开始使用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

我是编程新手,刚刚开始使用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"
但它给了我一个“没有这样的文件或目录”的错误,我似乎无法回避。
我确信这段代码还有很多其他问题,但我不明白这一点。

首先在调试bash时,使用-x标志(
bash-x script.sh
)或在脚本中输入
set-x
,bash将打印出它正在执行的命令(带有变量扩展)这样你就能更容易地发现错误

在这个特定的代码段中,我们的ls输出被重定向到一个名为
$DESTINATION
的文件,并且sed将从标准输入读取数据,并写入
$DESTINATION
。因此,无论您如何更换oneliner中的管道都是错误的。因此,这看起来像是您的程序被阻止了,但sed将简单地等待标准输入上的输入


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

谢谢大家!我遵循了非常需要的格式建议和@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

将文件名添加到上一个
sed
命令。
bash-x您的脚本
是您的朋友。比较它从脚本的损坏版本和工作版本生成的日志,您将看到问题所在。顺便说一句,当
foo
bar
值包含斜杠时,不要使用
s/foo/bar/
,只需选择一个不同的符号:
s@foo@bar@
允许在
foo
bar
中使用斜杠,而无需转义。顺便说一句,
MUSIC=“$HOME/MUSIC/iTunes/iTunes\Media/MUSIC/”中的反斜杠
是错误的。引用逃离了空间;您不需要额外的反斜杠(另一方面,所有caps名称都用于对操作系统或系统有意义的变量;您的脚本应该为自己的变量使用小写名称,以避免意外冲突;请参阅第四段)。