удар. движущиеся файлы кроме файлов с данным суффиксом

Есть ли какой-либо путь в ударе в файлы шарика, который не заканчивается определенным суффиксом?

например, я делаю это:

$INCDIR/HDR_10_*$BACKUPDIR mv

Но я не хочу перемещать HDR_10_*, который заканчивается .gz

4
задан 12.11.2010, 17:37

3 ответа

Это работало бы на перемещение файла:

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. Технически Вы просите шарик, чтобы оба соответствия один шаблон, но не другой, который я не думаю, существовали как простой единственный объект.

4
ответ дан 07.12.2019, 20:09

Под 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) если у Вас нет серьезного основания опустить их. Иначе Вы столкнетесь с проблемой, если у Вас будут файлы, имя которых содержит специальные символы, такие как пробел или \[?*.

1
ответ дан 07.12.2019, 20:09

Если Вы используете 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 \
1
ответ дан 07.12.2019, 20:09

Теги

Похожие вопросы