带通配符的BASH参数

时间:2012-03-06 19:10:49

标签: bash parameters wildcard

我正在尝试使用bash脚本找到&将类似文件复制到目标目录。

例如,我将参数12300传递给脚本,我想将所有以12300开头的文件复制到新目录。

像这样:

sh script.sh 12300

这是脚本:

if [ -f /home/user/bashTest/$@*.jpg ]
then
    cp /home/user/bashTest/$@*.jpg /home/user/bashTest/final/
fi

这不起作用。我尝试了各种解决方案但没有任何效果。 问题是:如何在参数中使用通配符?

5 个答案:

答案 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