Параметры BASH с подстановочными знаками - PullRequest
2 голосов
/ 06 марта 2012

Я пытаюсь создать 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 ]

2 голосов
/ 06 марта 2012

Вот решение:

#!/bin/bash    
cp /home/user/bashTest/${1}*.jpg /home/user/bashTest/final/

Обсуждение

  • В этом случае простая команда cp выполнит
  • Я проверил это сфайлы со встроенными пробелами
2 голосов
/ 06 марта 2012

Когда вы проверяете наличие нескольких файлов с -f или -e, это может стать неприятным.Я рекомендую блог kenfallon .Это что-то вроде того, что он бы порекомендовал:

#! /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 голосов
/ 06 марта 2012

Заключите вещь, которая расширяется до параметров в {}, т.е. /home/user/bashTest/${@}*.jpg. Однако вы должны использовать $1 вместо $@ в вашем случае, поскольку вы, похоже, способны обрабатывать только первый аргумент, данный сценарию. $1 расширяется до первого аргумента, $2 до второго и т. Д.

Вам также необходим цикл для перебора всех файлов, в которые распространяется этот глобус, например,

for file in /tmp/${@}*.jpg
do
    if [ -f $file ]
    then
        echo $file
    fi
done
1 голос
/ 06 марта 2012

Запишите это в script.sh:

cp /home/user/bashTest/$1*.jpg / home / user / bashTest / final /

Вот и все.

UPD. Решение @macduff также полезно.

0 голосов
/ 07 марта 2012

Это найдет все из них в вашем каталоге $ 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
...