在bash脚本中读取带有空格路径的目录的输入。

12 浏览
0 Comments

在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我希望它只更改文件名,但是遇到了问题。非常感谢任何帮助。

0
0 Comments

在bash脚本中,如果路径中包含空格,会导致读取输入的问题。这是因为bash将空格视为分隔符,而不是作为路径的一部分。因此,如果尝试读取包含空格的路径,bash会将空格解析为不同的变量。

解决这个问题的方法是使用引号将包含空格的路径括起来。通过将路径用引号括起来,bash将会将整个路径识别为一个变量。

另外,如果您不喜欢使用引号括起来变量(以避免单词拆分),可以考虑切换到Zsh。在Zsh中,您可以直接使用变量而不需要使用引号括起来。

因此,如果要循环遍历包含空格的路径,需要将路径用引号括起来。例如:

for file in "$directory"

但是这样做只会循环一次,循环变量file将绑定到变量directory的内容。如果要循环遍历目录中的条目,可以使用以下示例代码:

for dirent in "$directory"/*

0