mv: 无法统计 - 没有这样的文件或目录
mv: Cannot stat - No such file or directory
我已将 ls 命令的输出通过管道传输到一个文件中。 The contents 是这样的:
[Chihiro]_Grisaia_no_Kajitsu_-_01_[1920x816_Blu-ray_FLAC][D2B961D6].mkv
[Chihiro]_Grisaia_no_Kajitsu_-_02_[1920x816_Blu-ray_FLAC][38F88A81].mkv
[Chihiro]_Grisaia_no_Kajitsu_-_03_[1920x816_Blu-ray_FLAC][410F74F7].mkv
我尝试根据剧集编号重命名这些剧集如下:
cat grisaia | while read line;
#get the episode number
do EP=$(echo $line | egrep -o "_([0-9]{2})_" | cut -d "_" -f2)
if [[ $EP ]]
#escape special characters
then line=$(echo $line | sed 's/\[/\[/g' | sed 's/\]/\]/g')
mv "$line" "Grisaia_no_Kajitsu_${EP}.mkv"
fi
done
mv 命令以代码 1 退出并出现以下错误:
mv: cannot stat
'\[Chihiro\]_Grisaia_no_Kajitsu_-01\[1920x816_Blu-ray_FLAC\]\[D2B961D6\].mkv':
No such file or directory
我真正不明白的是,如果我复制无法统计的文件并尝试统计该文件,它会起作用。我什至可以采用与输出完全相同的字符串并单独执行 mv 命令。
如果用双引号 ("
) 将变量 ($line
) 括起来,则不需要转义这些特殊字符。所以你有两个选择:
完全删除以下分配:
then # line=$(echo $line | sed 's/\[/\[/g' | sed 's/\]/\]/g')`
或
去掉下一行中的双引号:
mv $line "Grisaia_no_Kajitsu_${EP}.mkv"
进一步考虑
解析 ls
的输出从来都不是一个好主意。考虑带空格的文件名。有关详细信息,请参阅 this document。
这里的cat
是不需要的:
cat grisaia | while read line;
...
done
改用它来避免不必要的管道:
while read line;
...
done < grisaia
为什么在某些情况下最好避免使用管道? (回复评论)
管道创建子壳(这是昂贵的),你也可以犯如下错误:
last=""
cat grisaia | while read line; do
last=$line
done
echo $last # surprise!! it outputs an empty string
原因是循环内的$last
属于另一个子shell。
现在,看看没有管道的相同方法:
while read line; do
last=$line
done < grisaia
echo $last # it works as expected and prints the last line
我已将 ls 命令的输出通过管道传输到一个文件中。 The contents 是这样的:
[Chihiro]_Grisaia_no_Kajitsu_-_01_[1920x816_Blu-ray_FLAC][D2B961D6].mkv
[Chihiro]_Grisaia_no_Kajitsu_-_02_[1920x816_Blu-ray_FLAC][38F88A81].mkv
[Chihiro]_Grisaia_no_Kajitsu_-_03_[1920x816_Blu-ray_FLAC][410F74F7].mkv
我尝试根据剧集编号重命名这些剧集如下:
cat grisaia | while read line;
#get the episode number
do EP=$(echo $line | egrep -o "_([0-9]{2})_" | cut -d "_" -f2)
if [[ $EP ]]
#escape special characters
then line=$(echo $line | sed 's/\[/\[/g' | sed 's/\]/\]/g')
mv "$line" "Grisaia_no_Kajitsu_${EP}.mkv"
fi
done
mv 命令以代码 1 退出并出现以下错误:
mv: cannot stat '\[Chihiro\]_Grisaia_no_Kajitsu_-01\[1920x816_Blu-ray_FLAC\]\[D2B961D6\].mkv': No such file or directory
我真正不明白的是,如果我复制无法统计的文件并尝试统计该文件,它会起作用。我什至可以采用与输出完全相同的字符串并单独执行 mv 命令。
如果用双引号 ("
) 将变量 ($line
) 括起来,则不需要转义这些特殊字符。所以你有两个选择:
完全删除以下分配:
then # line=$(echo $line | sed 's/\[/\[/g' | sed 's/\]/\]/g')`
或
去掉下一行中的双引号:
mv $line "Grisaia_no_Kajitsu_${EP}.mkv"
进一步考虑
解析
ls
的输出从来都不是一个好主意。考虑带空格的文件名。有关详细信息,请参阅 this document。这里的
cat
是不需要的:cat grisaia | while read line; ... done
改用它来避免不必要的管道:
while read line; ... done < grisaia
为什么在某些情况下最好避免使用管道? (回复评论)
管道创建子壳(这是昂贵的),你也可以犯如下错误:
last=""
cat grisaia | while read line; do
last=$line
done
echo $last # surprise!! it outputs an empty string
原因是循环内的$last
属于另一个子shell。
现在,看看没有管道的相同方法:
while read line; do
last=$line
done < grisaia
echo $last # it works as expected and prints the last line