Это работало бы на перемещение файла:
mv $( echo $INCDIR/HDR_10_* | grep -v '\.gz$') $BACKUPDIR
Вы также спросили 'в файлы шарика, который не заканчивается определенным суффиксом?' Bash имеет опцию оболочки (shopt) extglob, который позволяет расширенный globbing синтаксис. !(...glob...)
соответствия все кроме шаблона шарика.
shopt -s extglob
cd $INCDIR
mv !(*.gz) $BACKUPDIR
работал бы, только если $INCDIR содержал только файлы под названием HDR_10_ *, конкретно он будет соответствовать любому файлу или каталогу в $INCDIR, который не соответствует *.gz. Технически Вы просите шарик, чтобы оба соответствия один шаблон, но не другой, который я не думаю, существовали как простой единственный объект.
Под ksh, !(*.gz)
соответствия все файлы в текущем каталоге кроме файлов то соответствие *.gz
. Тот же шаблон работает в ударе после shopt -s extglob
, и в zsh после setopt ksh_glob
. Ни ksh, ни удар не имеют способ взять пересечение положительного совпадения и отрицательного соответствия. В zsh, после setopt extended_glob
, можно записать $INCDIR/HDR_10_*~$INCDIR/*.gz
.
Одно решение, в любой оболочке стиля Границы (пепел, удар, ksh, zsh...), должен выполнить итерации по файлам и проверить каждое соответствие.
for x in "$INCDIR"/HDR_10_*; do
case "$x" in
*.gz) :;;
*) mv -- "$x" "$BACKUPDIR";;
esac
done
Другое решение состоит в том, чтобы использовать find
. Следующая команда переместит файлы в подкаталоги также.
find "$INCDIR" -type f -name 'HDR_10_*' \! -name '*.gz' -exec mv {} "$BACKUPDIR" \;
Если у Вас есть GNU, находят (например, в соответствии с Linux), можно добавить -maxdepth 1
после "$INCDIR"
перемещать файлы только непосредственно в $INCDIR
.
Обратите внимание, что необходимо всегда использовать двойные кавычки вокруг подстановок переменных (например. "$INCDIR"
, нет $INCDIR
) если у Вас нет серьезного основания опустить их. Иначе Вы столкнетесь с проблемой, если у Вас будут файлы, имя которых содержит специальные символы, такие как пробел или \[?*
.
Если Вы используете find
, grep
, и xargs
, можно сделать это довольно легко.
Я уверен, что существуют лучшие конструкции, но это - то, которое приходит на ум сразу же:
# find <here>| <pattern> | <notpattern>| <what to do>
find $INCDIR | grep HDR_10_ | grep -v .gz | xargs mv $BACKUPDIR
На исправление указали в комментариях, что вышеупомянутый быстрый удар не будет работать из-за mv
не получая его аргументы в надлежащем порядке от xargs
:
find $INCDIR -name 'HDR_10_*' ! -name '*.gz' -exec mv {} $BACKUPDIR \