我正在尝试使用bash脚本找到&将类似文件复制到目标目录。
例如,我将参数12300传递给脚本,我想将所有以12300开头的文件复制到新目录。
像这样:sh script.sh 12300
这是脚本:
if [ -f /home/user/bashTest/$@*.jpg ]
then
cp /home/user/bashTest/$@*.jpg /home/user/bashTest/final/
fi
这不起作用。我尝试了各种解决方案但没有任何效果。 问题是:如何在参数中使用通配符?
答案 0 :(得分:2)
将扩展的内容包含在{}
中的参数中,即/home/user/bashTest/${@}*.jpg
。在您的情况下,您应该使用$1
而不是$@
,因为您似乎只能处理给脚本的第一个参数。 $1
扩展到第一个参数,$2
扩展到第二个参数。
您还需要一个循环来迭代此glob扩展到的所有文件,例如
for file in /tmp/${@}*.jpg
do
if [ -f $file ]
then
echo $file
fi
done
答案 1 :(得分:2)
当您使用-f
或-e
检查多个文件时,它可能会变得令人讨厌。我推荐kenfallon's blog。这就像他建议的那样:
#! /bin/bash
ls -l /home/user/bashTest/$1*.jpg > /dev/null
if [ "$?" = "0" ]
then
cp /home/user/bashTest/$1*.jpg /home/user/bashTest/final/
fi
不确定$@
将如何在这里播放,或者是否需要。
答案 2 :(得分:2)
这是一个解决方案:
#!/bin/bash
cp /home/user/bashTest/${1}*.jpg /home/user/bashTest/final/
cp
命令将执行答案 3 :(得分:1)
在script.sh中写这个:
cp /home/user/bashTest/$1*.jpg / home / user / bashTest / final /
就是这样。
UPD。 @macduff解决方案也很有用。
答案 4 :(得分:0)
这将在你的$ HOME目录和子目录中找到所有这些(你可能希望调整发现跟随/不遵循符号链接和/或调整它开始搜索的$ HOME基目录)
#!/bin/sh
DEST=/your/dest/folder
for FILE in `find "$HOME" -iname "$1"*`;do
[ -f "$FILE" ] && mv "$FILE" "$DEST/$FILE"
#or ln -s ...if you want to keep it in its original location
done
if you want to do multiple patterns using $@
for PATTERN in $@; do
for FILE in `find "$HOME" -iname "$PATTERN"*`;do
[ -f "$FILE" ] && mv "$FILE" "$DEST/$FILE"
done
done