【发布时间】:2021-05-09 09:53:06
【问题描述】:
我找不到在read 中添加包含空格的条目的方法?我想将目录放入“输入要清理的目录:”read。我认为它将空格作为单独的变量读取。输入类似于/home/user/apple sauce “清理”只是从文件名中删除特殊字符。
#!/bin/bash
read -p "Enter directory to be cleaned: " directory
echo "Current Directory Structure"
/usr/bin/ls -la $directory
read input
if [ "$input" == "y" ]
then
echo "Cleaning files..."
for file in $directory; do mv $file $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g'); done &
else
stop
fi
我面临的另一个问题是清理在创建新文件名时重复整个目录。如果我在目录本身中运行 for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g'); done & 命令,它只会创建新的文件名。如果我指定目录,它会写出整个目录:
++ 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_
我希望它只是更改文件名但有问题。任何帮助都非常感谢。
【问题讨论】:
-
你大多需要双引号变量; shellcheck.net 会指出在哪里。此外,
for file in $directory不会列出目录中的文件,请使用for file in "$directory"/*。sed模式尝试替换文件名 和 包含目录名称(这更复杂)中的字符也会遇到问题。哦,使用IFS= read -r -p ...来避免破坏反斜杠以及开头/结尾处的空格。 -
@saleetzo :不要在一个问题中问两个问题。为此使用两个问题。
-
谢谢@GordonDavisson!我也不知道 spellcheck.net,很酷。
标签: bash