如果 Bash 脚本中存在同名文件,我该如何移动特定文件夹?

如果 Bash 脚本中存在同名文件,我该如何移动特定文件夹?

我正在尝试编写一个 shell 脚本来查找特定文件并将其移动到文件夹中。

    #!/bin/sh
echo -n "/home/cosmoretro/movie/"
        read text2
while :
        do
        echo -n "Ara:"
        read text1
        b=$(find /home/cosmoretro 2>/dev/null -iname "$text1"*)
        IFS=$'\n'
    mv $b /home/cosmoretro/movie/"$text2"
done

但是如果有与我搜索的文件夹相同的文件,它也会移动文件。

我想要的只是移动文件夹。

答案1

我甚至很难读懂这个脚本。我可以建议你稍微重写一下吗?

#!/bin/sh
echo -n "/home/cosmoretro/movie/"
read destinationFileName

while :
do
    echo -n "Ara:"
    read sourceFileName
    sourceFile=$(find /home/cosmoretro -type d -iname "$sourceFileName" -print -quit 2> /dev/null)
    if [[ -z $sourceFile ]]; then
        echo "No file named $sourceFileName found"
    else
        mv -- "$sourceFile" /home/cosmoretro/movie/"$destinationFileName"  
    fi
done

我做了什么:

  • 使用描述性名称,destinationFileName例如text2
  • 正确缩进
  • find通过指定 来仅查找目录。-type d如果您只想移动文件,请使用-type f而不是-type d
  • 将重定向移至命令末尾,因为它并不重要
  • find找到第一个文件后停止( -quit
  • *删除命令中多余的部分find——不确定你希望在那里放什么。如果你希望文件名包含通配符(例如搜索foo将返回foobar),那么你需要将通配符放在进入引号,即"$sourceFileName*"
  • 检查是否找到文件并-z测试结果是否为空。
  • 通过使用选项结尾选项来防止mv以 开头的文件名---
  • 正确引用参数以防止空格破坏命令(无需更改IFS

相关内容