在bash脚本中读取带有空格路径的目录的输入。
在bash脚本中读取带有空格路径的目录的输入。
我找不到在read
中放置包含空格的条目的方法。我想在\"输入要清理的目录:\"的read
中放置目录。我认为它将空格读取为单独的变量。输入应该是像/home/user/apple sauce
这样的内容。 \"清理\"只是从文件名中删除特殊字符。\n
#!/bin/bash read -p "输入要清理的目录:" directory echo "当前目录结构" /usr/bin/ls -la $directory read input if [ "$input" == "y" ] then echo "正在清理文件..." for file in $directory; do mv $file $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g'); done & else stop fi
\n我面临的另一个问题是,当清理创建新的文件名时,它会重复整个目录。如果我在目录本身运行for file in *; do mv \"$file\" $(echo \"$file\" | sed -e \'s/[^A-Za-z0-9._-]/_/g\'); done &
命令,它只会创建新的文件名。如果我指定目录,它会输出整个目录:\n
++ sed -e 's/[^A-Za-z0-9._-]/_/g' ++ echo '/home/apples/scratch/test1/test:something?' + mv '/home/apples/scratch/test1/test:something?' _home_apples_scratch_test1_test_something_
\n我希望它只更改文件名,但是遇到了问题。非常感谢任何帮助。
在bash脚本中,如果路径中包含空格,会导致读取输入的问题。这是因为bash将空格视为分隔符,而不是作为路径的一部分。因此,如果尝试读取包含空格的路径,bash会将空格解析为不同的变量。
解决这个问题的方法是使用引号将包含空格的路径括起来。通过将路径用引号括起来,bash将会将整个路径识别为一个变量。
另外,如果您不喜欢使用引号括起来变量(以避免单词拆分),可以考虑切换到Zsh。在Zsh中,您可以直接使用变量而不需要使用引号括起来。
因此,如果要循环遍历包含空格的路径,需要将路径用引号括起来。例如:
for file in "$directory"
但是这样做只会循环一次,循环变量file
将绑定到变量directory
的内容。如果要循环遍历目录中的条目,可以使用以下示例代码:
for dirent in "$directory"/*