Поиск и копирование с помощью xargs не работает в сценарии

Мне нужно найти три файла из огромного каталога и скопировать их в другой каталог.

Вот что я сделал:

find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8 | xargs cp -t $bdir

Файл a1 копируется в место назначения, но другие файлы не копируются в место назначения. Это мой сценарий:

#!/bin/bash
date=$(date)
day=$(date +"%u")
adir=/x/y
bdir=/a/b
 {
      if [ "$day" == "5" ] ; then
         find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8 | xargs cp -t $bdir
       else
           echo "failed"
       fi
    }

Я запускаю его в сценарии, и курсор не возвращается в терминал. Можно как-нибудь заставить его работать?

0
25.08.2017, 16:15
2 ответа

Попробуйте удалить скобки. Эта команда работает для меня непосредственно в терминале и в оболочке bash (изменил cp на 'file', чтобы проверить, работает ли она..):

 find . -type f -name "a4*" -o -name "d1*" -o -name "f2*" -mtime -8 | xargs file

Вы также можете попробовать цикл for, который может дать вам больше места (цикла) для делай дела. Измените строку findна

for a_file in `find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8`
do
   cp -t $a_file $bdir
done

. Вы можете поиграть, удалив -mtime -8и заменив cp -t $a $bdirна echo " Файл: "$a_fileдля тестирования...

0
28.01.2020, 04:40

Как уже говорилось, ваш сценарий выглядит синтаксически и грамматически правильным, поэтому должно быть что-то вне самого сценария, что заставляет его вести себя так, как он ведет себя.

Сказав это, я могу высказать свое мнение о сценарии. Так я бы написал эквивалентную вещь:

#!/bin/sh

day=$(date +'%u')
adir='/x/y'
bdir='/a/b'

case "$day" in
    5)  find "$adir" -type f -mtime -8 -name 'a[123]*' -exec cp {} "$bdir"/ ';'
        ;;
    *)  printf 'Error: Unhandled day "%s"\n' "$day" >&2
        exit 1
esac

Это просто использует тот факт, что различные имена, которые вы хотите сопоставить, могут сопоставляться с одним шаблоном подстановки имени файла. Он также не зависит от GNU cp, а его -tвариант (избавлен отxargs). И поскольку он не использует никаких «башизмов», его также можно интерпретировать как /bin/sh.

case... esacлегче читать (и писать ), чем набор if... then... elif.

0
28.01.2020, 04:40

Теги

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