![如果 Bash 脚本中存在同名文件,我该如何移动特定文件夹?](https://linux22.com/image/1417314/%E5%A6%82%E6%9E%9C%20Bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%AD%98%E5%9C%A8%E5%90%8C%E5%90%8D%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E8%AF%A5%E5%A6%82%E4%BD%95%E7%A7%BB%E5%8A%A8%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%9F.png)
我正在尝试编写一个 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
)